수정이 안되는 포인터로 선언된 문자열
char array[] = "code";
printf("%s\n", array); // print : code
array[0] = 'k';
printf("%s\n", array); // print : kode
"code"라는 문자열을 배열로 선언했다. 이후 문자열의 첫글자를 k로 바꿔서 출력해보면 "kode"가 출력된다. 문자열을 배열로 선언하면 수정이 가능하다는것을 알 수 있다.
char *pointer = "code";
printf("%s\n", pointer); // print : code
// pointer[0] = 'k';
printf("%s\n", pointer); // not executed
이번에는 "code"라는 문자열을 포인터로 선언했다. 그리고 위와 마찬가지로 첫글자를 k로 바꿔서 출력했더니 printf문을 실행하지 않았다. 컴파일러에 따라 에러를 출력하거나 "code"를 그대로 출력하는 등 다를 수 있지만 "kode"는 출력되지 않는다.
다른곳에 저장되는 배열과 포인터
char array[] = "code"는 char형 변수 5개(\0 포함)가 연속적으로 스택 영역에 5바이트의 메모리 공간을 확보한다.
반면에 char *point = "code"는 코드 영역에 9바이트(5 + 포인터 변수 4바이트)의 메모리 공간을 확보한다.
위의 배열과 포인터가 스택과 코드에 저장하듯이 프로그램은 변수 등이 저장되는 공간들이 필요하며 종류에 따라서 각각 다른 공간에 저장된다. 문자열 포인터는 위의 메모리 레이아웃에서 text(code segment)에 저장된다. 그리고 text는 ROM(Read Only Memory)으로 이루어져있다. 따라서 수정이 안되는 것이다.
참고
https://stackoverflow.com/questions/1576489/where-are-constant-variables-stored-in-c
https://www.geeksforgeeks.org/memory-layout-of-c-program/
https://overiq.com/c-programming-101/character-array-and-character-pointer-in-c/
최근댓글