C++의 문자열 리터럴(char*)이 상수여야 하는 이유는?
나는 최근에 C++를 배우고 있는데, C++의 문자열 리터럴은 상수여야 하지만 C에서는 그렇지 않다는 것을 깨달았다.여기 예가 있다.다음 코드는 C에서는 유효하지만 C++에서는 유효하지 않다.
char* str = "Hello World";
C++에서 같은 일을 하기 위해서는 다음과 같은 문구를 사용해야 한다.
const char* str = "Hello World";
왜 그런지 누가 설명해 주시겠습니까?
크리스티안 기븐스의 대답에 대해 좀 더 자세히 말하자면...
C에서 문자열 리터럴은"Hello World"
의 배열로 저장되어 있다.char
프로그램 수명 동안 볼 수 있도록.문자열 리터럴은 불변해야 하며, 일부 구현에서는 리터럴의 내용을 수정하려고 하면 런타임 오류가 트리거되는 읽기 전용 메모리 세그먼트에 저장된다.일부 구현은 그렇지 않으며, 리터럴의 내용을 수정하려고 시도해도 런타임 오류가 발생하지 않을 수 있다(의도대로 작동하는 것처럼 보일 수 있다).C 언어 정의는 컴파일러가 적합하다고 보는 상황을 자유롭게 처리할 수 있도록 "정의되지 않은" 행동을 남긴다.
C++에서는 문자열 리터럴이 다음 배열로 저장된다.const char
즉, 리터럴의 내용을 수정하려는 모든 시도가 컴파일 시간에 진단을 촉발할 것이다.
크리스찬이 지적한 바와 같이, The는const
키워드는 원래 C의 일부가 아니었다.하지만 원래 C++의 일부였고, 문자열 리터럴을 사용하는 것이 조금 더 안전하다.
기억하라const
키워드는 "읽기 전용 메모리에 저장"을 의미하는 것이 아니라 "이것은 할당 대상이 아닐 수 있다"는 의미일 뿐이다.
또한 기억하라, 그것이 피연산자가 아니라면.sizeof
또는 단위의*
연산자 또는 선언에서 문자 배열을 초기화하는 데 사용되는 문자열 리터럴로, "N 요소 배열" 유형의 표현식T
"은(는) 다음(으) 유형의 표현으로 변환될 것이다.T
" 그리고 표현식의 값은 배열의 첫 번째 요소의 주소가 될 것이다.
C++에서 쓸 때
const char *str = "Hello, world";
문자열의 첫 번째 문자의 주소가 다음 위치에 저장됨str
설정할 수 있다.str
다른 문자열 리터럴을 가리키려면:
str = "Goodbye cruel world";
하지만 당신이 할 수 없는 것은 문자열의 내용을 수정하는 것이다.
str[0] = 'h';
또는
strcpy( str, "Something else" );
에 CAMS를 않았다.const
그래서 그들이 리터럴을 요구하도록 바꾸면 레거시 코드가 깨질 것이다.const
-키워드 소개 후 발표.C의 끈 문자는 그래도 불변하기 때문에 내용이 바뀌지 않더라도 정의되지 않은 행동이다.const
-적격.
C++로 디자인했다.const
키워드처음에 C++는 문자열 리터럴을 비(non)에 할당하도록 허용했다.const
-jaughterchar *
s 기존 C 코드와의 호환성을 위한 것으로 가정한다.그러나 C++03 표준에 따라, 그들은 불협화음을 영구적으로 계속하도록 허용하기보다는 이 기능을 무효화하기로 결정하였다.비-비-비-에 의존하는 레거시 C++ 코드의 양을 추측할 수 있다.const
자격이 있는char *
s 문자열 리터럴이 충분히 작아서 가치 있는 절충이라고 지적한다.
참조URL: https://stackoverflow.com/questions/61601872/why-do-string-literals-char-in-c-have-to-be-constants
'IT이야기' 카테고리의 다른 글
두 세트 간의 차이점 확인 (0) | 2022.05.22 |
---|---|
정적 맵을 초기화하려면 어떻게 해야 하는가? (0) | 2022.05.22 |
Java 해시맵 검색은 정말 O(1)인가? (0) | 2022.05.22 |
Vue.js 상위 항목에서 하위 구성 요소 데이터 업데이트 (0) | 2022.05.22 |
Vuex를 사용할 때 내 Vue 앱에서 jwt의 혜택을 받을 수 있을까? (0) | 2022.05.22 |