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);
'C,C++' 카테고리의 다른 글
C++ 멤버 초기화 리스트 (0) | 2022.04.10 |
---|---|
C++ 가상 함수(virtual function) (0) | 2022.04.09 |
c++에서 string 클래스를 이용한 문자열 사용 ( getline() ) (0) | 2022.03.12 |
배열의 크기를 넘어가서 사용할 경우 (0) | 2022.02.14 |
이중포인터 (0) | 2022.02.03 |