이 문제의 원인 ( char* str = "some string"
다른 사람들이 설명한 문제보다 감지하기가 더 어렵습니다 )은 사용 중 constexpr
입니다.
constexpr char* str = "some string";
그것은와 비슷하게 동작 할 것 const char* str
같으며 char*
, 전에 발생했던 것처럼 경고를 일으키지 않지만 대신으로 동작합니다 char* const str
.
세부
상수 포인터 및 상수 포인터 사이의 차이 const char* str
와는 char* const str
다음과 같이 설명 될 수있다.
const char* str
: str을 const char에 대한 포인터로 선언합니다. 이것은이 포인터가 가리키는 데이터가 상수임을 의미합니다. 포인터를 수정할 수 있지만 데이터를 수정하려고하면 컴파일 오류가 발생합니다.
str++ ;
: 유효 합니다. 가리키는 데이터가 아니라 포인터를 수정하고 있습니다.
*str = 'a';
: 유효하지 않습니다 . 가리키는 데이터를 수정하려고합니다.
char* const str
: str을 char에 대한 const 포인터로 선언하십시오. 이는 점이 일정하지만, 지시되는 데이터도 일정하지 않음을 의미합니다. 포인터는 수정할 수 없지만 포인터를 사용하여 데이터를 수정할 수 있습니다.
str++ ;
: 유효하지 않습니다 . 상수 인 포인터 변수를 수정하려고합니다.
*str = 'a';
: 유효 합니다. 가리키는 데이터를 수정하려고합니다. 이 경우 컴파일 오류가 발생하지 않지만 런타임 오류 가 발생합니다 . 문자열은 컴파일 된 바이너리의 읽기 전용 섹션으로 이동합니다. 이 문장은 예를 들어 메모리를 동적으로 할당 한 경우에 적합합니다. char* const str = new char[5];
.
const char* const str
: str을 const char에 대한 const 포인터로 선언합니다. 이 경우 포인터를 가리 키거나 가리키는 데이터를 수정할 수 없습니다.
str++ ;
: 유효하지 않습니다 . 상수 인 포인터 변수를 수정하려고합니다.
*str = 'a';
: 유효하지 않습니다 . 우리는이 포인터가 가리키는 데이터를 수정하려고 노력하고 있습니다.
내 경우에는 문제는 내가 아닌 constexpr char* str
것처럼 작동 할 것으로 기대했다는 것이 었습니다.const char* str
char* const str
시각적으로 전자에 더 가깝게 보이기 때문에 것입니다.
또한에 대해 생성 된 경고는와 constexpr char* str = "some string"
약간 다릅니다 char* str = "some string"
.
- 컴파일러 경고
constexpr char* str = "some string"
:ISO C++11 does not allow conversion from string literal to 'char *const'
- 에 대한 컴파일러 경고
char* str = "some string"
: ISO C++11 does not allow conversion from string literal to 'char *'
.
팁
당신이 사용할 수있는 C의 횡설수설 ↔ 영어 변환 변환을 C
쉽게 이해할 수있는 영어 문장을 선언하고, 그 반대의 경우도 마찬가지입니다. 이것은 C
유일한 도구이므로 독점적 인 constexpr과 같은 것을 지원하지 않습니다 C++
.
strncpy(str, func, 255)
대신에 사용해야 합니다strcpy(str, func)
. 그리고 strncpy는 문자열 끝에 '\ 0'을 추가하는 것을 잊지 마십시오.