programing

Is it bad to declare a C-style string without const? If so, why?

projobs 2022. 8. 18. 23:17
반응형

Is it bad to declare a C-style string without const? If so, why?

Doing this in C++

char* cool = "cool";

compiles fine, but gives me a warning:

deprecated conversion from string constant to char*.

일부러 C스타일의 스트링을 사용하는 일은 없습니다.std::string하지만 만약을 위해 다음과 같은 질문을 받습니다.

C-스타일 스트링을 선언할 때 C-스타일 스트링을 선언하는 것은 나쁜 관행입니까?const수식어?그렇다면 왜?

Yes, this declaration is bad practice, because it allows many ways of accidentally provoking Undefined Behavior by writing to a string literal, including:

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

On the other hand, this is perfectly fine, since it allocates a non-const array of chars:

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새로운 코드에 대해서는 강력히 추천합니다만, 오래된 코드에 대해서는, 매우 적은 이익을 위해서 대량의 스크루 워크가 필요하게 되는 경우가 있습니다.

It's bad. It's very bad. To the point this isn't possible to do anymore in C++11.

Modifying the memory of a string literal is undefined behaviour.

첫번째,char* cool = "cool";표준 C++가 아닙니다.문자열 리터럴의 유형은 다음과 같습니다.const char[n]따라서 위의 코드 행은 const-corrective를 위반하므로 컴파일하지 않습니다.GCC 등의 일부 컴파일러는 이를 허용하지만 C로부터의 홀드오버이기 때문에 경고를 보냅니다.MSVC는 에러이므로 에러를 발행합니다.

둘째, 컴파일러가 당신을 위해 작동하게 하는 것은 어떨까요?표시가 되어 있는 경우const실수로 수정하려고 하면 좋은 컴파일러 오류가 발생합니다.그렇지 않으면 찾기 훨씬 어려운 런타임 오류가 발생할 수 있습니다.

는 바이너리 stringtable, 2(키워드: stringtable, stringtable))에될 수 않습니다..strtab: § : 개요

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

두 변수가 같은 메모리 위치에 지정할 수 있다.그 중 한 사람의 내용 수정해도 너무, 그 이후에는 나머지를 변경할 수 있다.

strcpy(nothot, "warm");

의 your your.cool" " 따따""""

요컨대 정의되지 않은 행동이다.

그것은 문자열 리터럴로 메모리 읽기 전용 섹션에 있을 것 그러므로 일정해야 한다. 있는 경우char cool[] = "cool";그리고 그것이 문제가 아닌, 기억은 너의 것이다.

char* 시원하)" 시원한"

cool 블록에 격납)에됩니다.만약 당신이" 시원한"그 점 시원한에 의해 문자열을 고치려는 프로그램이 운영될 때 당신은 세그먼트 오류와 같은 오류를 얻을 것이다.「 」를 사용하고 const char* cool = "cool"때 편찬하다. 만약 당신이 문자열 수정하려고 하면 잘못을 받을 것이다.
정보를 더http://www.geeksforgeeks.org/storage-for-strings-in-c/로 이 페이지를 읽을 수 있다.

그것의 연습은 잘 strings(특히 당신이 문자열 리터럴을 사용했다)지만 C이 거의 없기 당신은 c++에 경고를 던질 것이다만 큰 차이는 c,also에 어떤 경고 일부 컴파일러 c로 간단히 .c 연장이라고 생각하지만 생각 나게 하는 const를 써 본다.C는 c++이므로 이러한 점에 주의해 주십시오.그렇지 않으면 문자열과 함께 const를 사용하는 것이 좋습니다.따라서 실수로 문자열을 변경하거나 읽기 전용 메모리에 저장된 문자열 리터럴을 변경하려고 하지 않습니다.

언급URL : https://stackoverflow.com/questions/38574148/is-it-bad-to-declare-a-c-style-string-without-const-if-so-why

반응형