예, 지역 변수의 수명 은 생성 된 범위 ( {
, }
) 내에 있습니다.
로컬 변수에는 자동 또는 로컬 저장소가 있습니다. 자동은 그들이 자동으로이 끝을 생성하는 내 범위를 한 번 파괴하기 때문이다.
그러나 여기에있는 것은 구현 정의 읽기 전용 메모리에 할당 된 문자열 리터럴입니다. 문자열 리터럴은 지역 변수와 다르며 프로그램 수명 내내 살아 있습니다. 그들은 정적 기간 [참조 1] 수명을 갖습니다 .
주의 사항!
그러나 문자열 리터럴의 내용을 수정하려는 시도는 정의되지 않은 동작 (UB)입니다. 사용자 프로그램은 문자열 리터럴의 내용을 수정할 수 없습니다.
따라서 항상 const
문자열 리터럴을 선언하는 동안 사용하는 것이 좋습니다 .
const char*p = "string";
대신에,
char*p = "string";
사실, C ++에서는 C에서는 const
아니지만 문자열 리터럴을 선언하는 것은 더 이상 사용되지 않습니다 . 그러나 a를 사용하여 문자열 리터럴을 선언하면 const
컴파일러가 일반적으로 문자열 리터럴을 수정하려고 할 때 경고를 표시하는 이점이 있습니다. 두 번째 경우.
샘플 프로그램 :
#include<string.h>
int main()
{
char *str1 = "string Literal";
const char *str2 = "string Literal";
char source[]="Sample string";
strcpy(str1,source);
strcpy(str2,source);
return 0;
}
산출:
cc1 : 경고가 오류로 처리됨
prog.c : 함수 'main'에서 :
prog.c : 9 : 오류 : 'strcpy'의 인수 1을 전달하면 포인터 대상 유형에서 한정자가 삭제됩니다.
컴파일러는 두 번째 경우에 대해 경고하지만 첫 번째 경우에는 경고하지 않습니다.
여기에서 몇 명의 사용자가 묻는 질문에 답하려면 :
정수 리터럴은 무엇입니까?
즉, 다음 코드가 유효합니까?
int *foo()
{
return &(2);
}
대답은이 코드가 유효하지 않다는 것입니다. 형식이 잘못되어 컴파일러 오류가 발생합니다.
다음과 같은 것 :
prog.c:3: error: lvalue required as unary ‘&’ operand
문자열 리터럴은 l- 값입니다. 즉 : 문자열 리터럴의 주소를 사용할 수 있지만 내용을 변경할 수는 없습니다.
그러나, 다른 리터럴 ( int
, float
, char
등) (R) - 값 (C 표준 용어 사용되어 식의 값 과 자신의 주소를 전혀 수행 할 수없는 이러한을위한).
[참조 1] C99 표준 6.4.5 / 5 "문자열 리터럴-의미 체계":
변환 단계 7에서는 문자열 리터럴 또는 리터럴의 결과 인 각 멀티 바이트 문자 시퀀스에 값이 0 인 바이트 또는 코드가 추가됩니다. 그런 다음 멀티 바이트 문자 시퀀스를 사용하여 시퀀스를 포함하기에 충분한 정적 저장 기간 및 길이 배열을 초기화합니다 . 문자열 리터럴의 경우 배열 요소는 char 유형을 가지며 멀티 바이트 문자 시퀀스의 개별 바이트로 초기화됩니다. 와이드 문자열 리터럴의 경우 배열 요소는 wchar_t 유형을 가지며 와이드 문자 시퀀스로 초기화됩니다.
요소에 적절한 값이있는 경우 이러한 배열이 구별되는지 여부는 지정되지 않습니다. 프로그램이 이러한 배열을 수정하려고하면 동작이 정의되지 않습니다 .
int rc
입니다. 그 수명은return
-s 각각에서 끝납니다 . 반환하는 포인터는 문자열 리터럴에 대한 것입니다. 문자열 리터럴에는 정적 저장 기간이 있습니다. 수명은 적어도 프로그램의 수명과 같습니다.