728x90
char *와 char[] 의 차이
ft_printf 문제 해결 중, 문자열 중간의 값을 널로 임의로 바꾸기 위해 char[i] == 0
(i는 임의의 인덱스)를 해주었다.
그 결과, bus error
를 마주쳤다.
무엇이 문제인지 찾다가 배운 char *와 char []의 차이점
char str[] = "abc";
str[1] = '0';
printf("[] : %s",str); // a0c
char str* = "abc";
str[1] = '0';
printf("[] : %s", str); //bus error;
당연히 같다고 생각한 두 문자열의 선언은 어셈블리에서 차이점이 있다.
*str의 경우는 .rodata영역에 있는 "abc"에 대한 포인터 이므로 값을 변경하려 하면 bus error가 발생한다.
str[]의 경우 함수 호출 시에 "abc" 문자열을 함수의 스택으로 복사해온다고 한다.
char *의 경우 포인터 변수를 할당하여 주소 값을 가지고 있으며,
char []의 경우 str 그 자체가 주소값이 된다.
동적할당을 하면 char *의 문제는 사라진다.
과제 중 이런식의 문제가 생기면 strdup을 이용해서 기존에 문자열을 동적할당 후 값을 변경해서 문제를 해결하였다.
📚 참고 서적 및 웹사이트
728x90
'공부 > C\C++' 카테고리의 다른 글
[C/C++] Heap BOF(Buffer OverFlow)란 (0) | 2021.03.31 |
---|---|
[C/C++] write와 printf의 혼용으로 인한 문제 (printf 출력 순서 이상) (0) | 2021.03.31 |
[C] 가변인자, 가변인자 함수 (0) | 2021.03.18 |
[C/C++] int와 long, unsigned int와 unsigned long의 차이와 혼동으로 인한 문제점 (0) | 2021.03.18 |
[C/C++] 구조체와 연결리스트 (0) | 2021.03.16 |