[C] C const char * vs char *const
Published:
In this post, grammar of const keyword in C is introduced.
Const
C에서 const keyword를 사용하면 해당 값을 변경할 수 없다는 의미이다.
const char *
const char *p = "hello";
char const *p = "hello"; // (위와 동일 표현)
위 경우, const의 대상은 *p, 즉 char이다. p가 가리키는 데이터(*p)는 바꿀 수 없고, p 자체(주소)는 바꿀 수 있다.
p = "world"; // 가능
*p = 'H'; // 불가능
MAX_DIR = 20;
const char *directories[MAX_DIR];
directories[0] = "dir1"; // 가능
directories[0] = "dir2"; // 가능
directories[0][0] = "k"; // 불가능
위 코드의 3, 4번째 줄은 각각 저장하는 포인터 주소의 값을 바꾸는 역할을 하므로 가능하고 5번째 줄은 포인터 가리키는 값을 바꾸려고 하므로 불가능하다.
const char *directory = malloc(10);
strcpy(directory, "hello"); // 불가능
directory = "hello"; // 가능, but memory leak 발생
위 코드의 2번째 줄은 할당된 malloc 영역에 “hello”를 넣으려 하는 작업이므로 불가능하다.
위 코드의 3번째 줄은 할당된 malloc 영역을 이용하지 않고 rodat 영역에 저장된 문자열 리터럴을 directory가 가리키게 하므로 주소를 바꾸는 기능이라 가능하지만, malloc에 의해 할당된 메모리의 누수가 발생하게 된다.
char const*
char *const p = buffer;
위 경우, const의 대상은 p, 즉 char pointer이다. p가 가리키는 주소는 바꿀 수 없고, p가 가리키는 내용은 바꿀 수 있다.
p = another_buffer; // 불가능
*p = 'A'; // 가능

Leave a Comment