2013-03-29 3 views
6

나는const를 숯불 * 숯불 *

char *s = "Hello World!" ; 

읽기 전용 메모리 포인터를 통해 수정할 수 없습니다 리터럴 문자열에 저장되어있는 것으로 알고 있습니다.

어떻게 이런 일이 또한 '문자열'의 char * 또는 const를 문자 *의 유형이

const char *s = "Hello World!"; 

다릅니 까?

const char *s = "Hello World!"; 
s[0] = 'X'; // compile error 

당신이 const를 사용하지 않는 경우 문제 다음 : const char *로 유형을 제공함으로써

+0

첫 번째되지 않습니다 방식으로 위험을 할 수 char*로 변환을 제거했습니다. – Beta

답변

6

는, 당신이하려고하면 컴파일러가 오류를 제공하기 때문에 실수로 메모리를 덮어을 어렵게 런타임까지 잡히지 않을 수도 있고, 프로그램이 미묘하게 잘못 될 수도 있습니다.

+0

아, 그렇습니다. char *를 수정하려고 시도했으나 성공적으로 컴파일되었지만 const char *는 성공적으로 컴파일되지 않았습니다. 따라서 기본적으로 const를 두는 것은 문자열을 변경하지 않는 빨간색 플래그를 사용합니다. 멋지다! – dharag

8

차이점은 후자가 합법적이며 이전은 그렇지 않다는 것입니다. C++ 11에서 변경된 내용입니다. 형식적으로 "Hello World!"의 유형은 const char[13]입니다. const char*으로 변환 할 수 있습니다. 예전에는 유형이 char[13] 일 수 있으며 char*으로 변환 될 수 있습니다. C++은 const을 추가하여 배열 형식을 변경했지만 char*으로 변환을 유지하여 char*을 사용하는 기존 C 코드는 C++에서 작동하지만 포인터가 가리키는 텍스트를 수정하면 정의되지 않은 동작이 생성됩니다. C++ 11은 그래서 지금 당신이 법적으로

const char *s = "Hello world!"; 
+0

'C++ 11은 gcc48이 아닌 char *'으로 변환을 제거했습니다. 이 gcc 버그입니까? –

+0

@LeonidVolnitsky - C++ 11에서는 변환이 허용되지 않습니다. 규칙은 컴파일러가 "진단 필요 없음"을 말하지 않는 제약 조건 위반에 대해 진단을 내야한다는 것입니다. 따라서 진단이 필요합니다. 이는 때로는 경고 일뿐입니다. –

+0

'const'를 추가하면 타입이 바뀌면'const '또는'const '이 더 논리적이지 않습니까? –