[C] C const char * vs char *const

1 minute read

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';            // 가능

Tags:

Categories:

Leave a Comment