c언어 문자열
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);