programing

const없이 C 스타일 문자열을 선언하는 것이 나쁜가요?

nasanasas 2020. 11. 24. 08:03
반응형

const없이 C 스타일 문자열을 선언하는 것이 나쁜가요? 그렇다면 그 이유는 무엇입니까?


C ++에서 수행

char* cool = "cool";

잘 컴파일되지만 경고가 표시됩니다.

문자열 상수에서 char * 로의 더 이상 사용되지 않는 변환입니다.

나는 고의적으로 C 스타일 문자열을 사용하지 않을 std::string것이지만이 질문을받는 경우를 대비하여 :

const수정 자 없이 C 스타일 문자열을 선언하는 것이 나쁜 습관 입니까? 그렇다면 그 이유는 무엇입니까?


예,이 선언은 다음을 포함하여 문자열 리터럴에 작성하여 정의되지 않은 동작을 실수로 유발하는 여러 가지 방법을 허용하기 때문에 나쁜 습관입니다.

cool[0] = 'k';
strcpy(cool, "oops");

반면에 상수가 아닌 문자 배열을 할당하므로 완벽하게 괜찮습니다.

char cool[] = "cool";

예, C ++에서는 항상 const char *또는 유형의 변수가있는 문자열 리터럴을 참조해야합니다 const char [N]. 이것은 새로운 C 코드를 작성할 때도 모범 사례입니다.

가능한 경우 문자열 리터럴은 읽기 전용 메모리에 저장됩니다. 해당 유형은 적절하게 규정되어 const있습니다. C ++가 아닌 C에는 읽기 전용 메모리에 저장되어 char [N] 있더라도 컴파일러가 유형을 제공하는 이전 버전과의 호환성 사마귀가 포함되어 있습니다. 이는 문자열 리터럴이 const한정자 보다 오래 되었기 때문 입니다. const지금은 "C89"라고 불리는 것에서 발명되었습니다. 이전의 "K & R"형태의 언어에는 없었습니다.

일부 C 컴파일러에는 이전 버전과의 호환성 사마귀가 비활성화되는 선택적 모드가 포함되어 char *foo = "...";있으며 C ++에서 수행하는 것과 동일하거나 유사한 진단을 제공합니다. GCC는이 모드를 철자합니다 -Wwrite-strings. 나는 새로운 코드에 적극 추천한다. 그러나 오래된 코드에 대해이 기능을 켜는 것은 거의 이익을 위해 엄청난 양의 스컷 워크를 요구할 수 있습니다.


그것은 나쁜. 아주 나쁘다. 지금까지는 C ++ 11에서 더 이상 수행 할 수 없습니다.

문자열 리터럴의 메모리를 수정하는 것은 정의되지 않은 동작입니다.


첫째, char* cool = "cool";표준 C ++가 아닙니다. 문자열 리터럴의 유형은 const char[n]. 따라서 위의 코드 줄은 const-correctness를 깨뜨리고 컴파일해서는 안됩니다. GCC와 같은 일부 컴파일러는이를 허용하지만 C에서 보류되므로 경고를 발행합니다. MSVC는 오류이므로 오류를 발행합니다.

둘째, 컴파일러를 사용하면 어떨까요? 표시된 const경우 실수로 수정하려고하면 멋진 컴파일러 오류가 발생합니다. 그렇지 않으면 찾기가 훨씬 더 어려울 수있는 정말 불쾌한 런타임 오류가 발생할 수 있습니다.


문자열 상수는 바이너리 당 한 번만 포함될 수 있기 때문에 좋지 않습니다 (키워드 : stringtable, .strtab). 예 :

char *cool = "cool";
char *nothot = "cool";

두 변수 모두 동일한 메모리 위치를 가리킬 수 있습니다. 그중 하나의 내용을 수정하면 다른 내용도 변경 될 수 있으므로

strcpy(nothot, "warm");

당신 cool은 "따뜻하게"됩니다.

즉, 정의되지 않은 동작입니다.


이것은 문자열 리터럴이므로 메모리가 읽기 전용 섹션에있을 수 있으므로 상수 여야합니다. 그렇다면 char cool[] = "cool";문제가되지 않는다면 기억은 당신의 것입니다.


char * cool = "쿨"

"cool"은 기능간에 공유되는 읽기 전용 블록 (일반적으로 데이터 세그먼트)에 저장됩니다. cool 포인트로 "cool"문자열을 수정하려고하면 프로그램이 실행될 때 세그먼트 오류와 같은 오류가 발생합니다. 를 사용 const char* cool = "cool"하면 문자열을 수정하려고하면 컴파일 할 때 오류가 발생합니다.
자세한 내용은이 페이지를 읽을 수 있습니다. http://www.geeksforgeeks.org/storage-for-strings-in-c/


문자열 (특히 문자열 리터럴을 사용할 때)에 대한 const를 작성하는 것이 좋지만 C에서는 거의 차이가 없습니다 .C에서는 경고가 표시되지만 c에서는 경고가 표시되지 않으며 일부 컴파일러는 단순히 .c 확장자를 가정합니다. c로하지만 .C는 c ++로 조심해야합니다. 그렇지 않으면 문자열의 경우 const를 사용하는 것이 좋습니다. 그러므로 실수로 문자열을 변경하거나 저장된 문자열 리터럴을 변경하지 마십시오. 읽기 전용 메모리에서.

참고 URL : https://stackoverflow.com/questions/38574148/is-it-bad-to-declare-ac-style-string-without-const-if-so-why

반응형