c언어를 처음 접했을 때 문자열을 char* 로 저장할 때와 char[]로 저장할 때 많이 헷갈렸다.

그래서 차이점을 정리해본다.

 

배열로 선언된 문자열

정상적으로 실행되는 경우

1. char s1[10] = "hello";

2. char s1[] ="hello";

 

3. char s1[10] = "Hello";

   s1[0] = 'A';

   printf("%s");  // Aello 

 

4. char s1[10] = "Hello";

   char s2[10];

   scanf("%s",s1);          => 기존에 있던 문자열은 사라지고 입력한 값으로 바뀜

   scanf("%s",s2);     

 

5. char buffer[100] = {0,};

   FILE* fp = fopen("a.txt","r");

   fread(buffer, sizeof(char), 4, fp);       

 

에러 발생하는 경우

1. char s1[10];

   s1 = "hello";            => 이미 선언된 배열에는 문자열 할당 X

 

   char s1[10] = {0,};

   s1 = "hello";            => X

 

   => 이미 선언된 문자열 배열에 값을 넣어주고 싶을 때 strcpy()로 넣는 것은 가능

         ( 단, scanf()로는 넣을 수 있음 )

 


포인터로 선언된 문자열

- 포인터는 단지 문자열의 주소를 가리키고 있을 뿐이라서 문자열의 값을 변경할 수 없음

  ( 즉 상수 취급 )

 

정상적으로 실행되는 경우

1. char* s1;

   s1 = "Hello";               => 되는데 되도록이면 const char* 로 선언해야 경고 안 뜸

 

2. const char* s1 = "hello";

   s1 = "bye";                 

   => const char*라서 상수는 맞지만 이건 포인터라서 가리키는 주소만

        바꿔주는 것일 뿐 원래 "hello"를 가리키는 주소의 값인 "hello"를 바꿔주는 게

        아니라 가능하다. 즉, 아예 다른 주소를 가리키게 하는 것일뿐이다!!

 

3. char* buffer = (char*)malloc(sizeof(char) * 100);

   FILE* fp = fopen("a.txt","r");

   fread(buffer, sizeof(char), 4, fp);

 

세그멘테이션 에러 발생하는 경우

1. char* s1;

   scanf("%s",s1);

 

2. char* s1 = "Hello";

   s1[0] = 'A'               => 문자열 포인터에 문자열을 저장하면 상수 취급됨

                                      그래서 값 변경 불가능

 

3. char* s1;

   FILE* fp = fopen("a.txt","r");

   fread(s1,sizeof(char),4,fp);

 

 

+ Recent posts