문제

나는 항상 끈 리터럴을 반환하지 않으려 고 노력합니다. 왜냐하면 그들이 함수 외부에서 정의되지 않았기 때문입니다. 그러나 이것이 사실인지 확실하지 않습니다. 예를 들어이 기능을 수행하겠습니다.


const char *
return_a_string(void)
{
    return "blah";
}

올바른 코드입니까? 그것은 나에게 효과가 있지만 아마도 내 컴파일러 (GCC)에만 효과가 있습니다. 따라서 문제는 (문자열) 리터럴이 범위를 가지고 있거나 항상 존재하거나 정의되어 있다는 것입니다.

도움이 되었습니까?

해결책

이 코드는 모든 플랫폼에서 괜찮습니다. 문자열은 정적 문자열 문자로 바이너리로 컴파일됩니다. 예를 들어 Windows에있는 경우 메모장으로 .exe를 열고 문자열 자체를 검색 할 수도 있습니다.

정적 문자열 문자 그럴 범위는 중요하지 않기 때문입니다.

스트링 풀링 :

찾아야 할 한 가지는 어떤 경우에는 실행 파일에 공간을 절약하기 위해 동일한 문자열 리터럴을 "풀링"할 수 있다는 것입니다. 이 경우 동일 한 각 문자열 문자는 동일한 메모리 주소를 가질 수 있습니다. 그래도 그것이 사실이거나 그렇지 않을 것이라고 가정해서는 안됩니다.

대부분의 컴파일러에서는 Stirng 리터럴에 정적 문자열 풀링을 사용할지 여부를 설정할 수 있습니다.

문자열 리터럴의 최대 크기 :

여러 컴파일러의 문자열 리터럴의 최대 크기가 있습니다. 예를 들어 VC ++의 경우 약 2,048 바이트입니다.

문자열 문자를 수정하면 정의되지 않은 동작이 나타납니다.

문자열 문자를 수정하는 것은 절대 완료되어서는 안됩니다. 정의되지 않은 행동이 있습니다.

char * sz = "this is a test";
sz[0] = 'T'; //<--- undefined results

넓은 문자열 리터럴 :

위의 모든 것은 넓은 문자열 리터럴에 동일하게 적용됩니다.

예 : l "이것은 넓은 문자열 문자입니다";

C ++ 표준 상태 : (섹션 Lex.String)

1 문자열 리터럴은 일련의 문자입니다 (정의 된대로 lex.ccon)는 "..."또는 l "..."에서와 같이 문자 L로 시작하여 선택적으로 문자 L로 시작하는 이중 인용문으로 둘러싸여 있습니다. L으로 시작하지 않는 문자열 문자는 일반적인 문자열 문자이며 좁은 문자열 문자라고도합니다. 일반적인 문자열 리터럴에는 "n const char의 배열"및 정적 저장 시간이 있습니다 (BASIC.STC), 여기서 n은 아래 정의 된대로 문자열의 크기이며 주어진 문자로 초기화됩니다. l "asdf"와 같은 l로 시작하는 문자열 문자는 넓은 문자열 문자입니다. 넓은 문자열 리터럴에는 "n const wchar_t 배열"유형이 있으며 정적 저장 시간이 있으며, 여기서 n은 아래 정의 된 문자열의 크기이며 주어진 특성으로 초기화됩니다.

2 모든 문자열 리터럴이 별개인지 여부 (즉, 겹치지 않는 객체에 저장됨)는 구현 정의됩니다. 문자열 문자를 수정하려는 시도의 효과는 정의되지 않았습니다.

다른 팁

나는 당신의 혼란이 다소 분명 해지도록 예를 들어 당신에게

char *f()
{
char a[]="SUMIT";
return a;
}

이것은 작동하지 않습니다.

하지만

char *f()
{
char *a="SUMIT";
return a;
}

이것은 작동합니다.

이유 : "Sumit"은 전역 범위를 가진 문자입니다. { 's', 'u', 'm', 'm', 'i', 't' ' 0'} 일련의 배열은 스코프가 제한되어 있으며 프로그램이 반환 되 자마자 사라집니다.

도움이 되었기를 바랍니다

이것은 다른 사람들이 설명한 것처럼 C (또는 C ++)에서 유효합니다.

내가 조심해야 할 한 가지는 DLL을 사용하는 경우이 코드를 포함하는 DLL이 언로드 된 경우 포인터가 유효하지 않다는 것입니다.

C (또는 C ++) 표준은 런타임시 코드로드 및 언로드 코드를 이해하거나 고려하지 않으므로 구현 정의 된 결과에 직면 할 수있는 모든 일은 다음과 같습니다. 정적 저장 시간은 통화 코드의 POV에서 프로그램의 전체 지속 시간 동안 지속되지 않도록 나타납니다.

네. 상관 없어요. 그들은 글로벌 문자열 테이블에 살고 있습니다.

아니요, 문자열 리터럴에는 범위가 없으므로 코드는 모든 플랫폼과 컴파일러에서 작동하도록 보장됩니다. 프로그램의 이진 이미지에 저장되므로 언제든지 액세스 할 수 있습니다. 그러나 그들에게 편지를 보내려고 const)는 정의되지 않은 행동으로 이어질 것입니다.

실제로 프로그램을로드 할 때로드 된 영역 인 실행 파일의 데이터 섹션에 저장된 제로 종료 문자열에 대한 포인터를 반환합니다. 캐릭터를 시도하고 바꾸지 않으면 예측할 수없는 결과를 줄 수 있습니다 ...

Brian이 언급 한 정의되지 않은 결과를 기록하는 것이 정말 중요합니다. Const Char * 유형을 반환하는 기능을 선언 했으므로 괜찮을 것입니다. 그러나 많은 플랫폼에서 문자열 리터럴은 실행 파일 (일반적으로 텍스트 세그먼트)의 읽기 전용 세그먼트에 배치되어 액세스 위반이 발생합니다. 대부분의 플랫폼에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top