파도가 칠 때는 서핑을

Soon as possible

Wait!

공부/C\C++

[C/C++] char *와 char []의 차이와 bus error

hyeonhki 2021. 3. 31. 15:48
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