2012-06-18 2 views
3

함수에서 문자열을 반환하는 방법에 대해 혼란 스럽습니다.함수에서 문자열을 반환하는 코드

char* someFunction() 
{ 
    return "Hello, World" 
} 

위 복귀 문 던져 "기능은 지역 변수의 주소를 반환"안 어떻게 함수는 다른 : 사실은 경고를 않습니다

char* newFunction() 
{ 
    char temp[] = "Hello, World"; 
    return temp; 
} 

위에서 언급했다.

+1

당신은 첫 번째 경우'const를 숯불 * '라는 단어는 그 당신이 C가없는 점을 감안 무슨 뜻인지 아마 아닙니다 ... 종종 예외 처리 메커니즘을 의미한다 "던져"정말 – Flexo

+0

주의해야 그 같은 타고난 지원. – Kaganar

+2

두 가지 경우의 중요한 차이점을 설명하는 기존 [질문] (http://stackoverflow.com/q/1704407/168175)이 있습니다. – Flexo

답변

1

문자열 리터럴에는 정적 저장 기간이 있습니다. 문자열에 대한 포인터를 반환 한 다음 문자열에 액세스 할 수 있으므로 완벽하게 유효하고 정의 된 동작입니다.

char* someFunction() 
{ 
    return "Hello, World" 
} 

아래의 경우 자동 저장 기간이있는 문자열에 대한 포인터를 반환합니다. 자동 저장 기간을 가진 객체는 정의 된 블록을 종료 한 후 삭제됩니다. 따라서 함수가 반환 된 후 액세스하는 것은 정의되지 않은 동작입니다.

char* newFunction() 
{ 
    char temp[] = "Hello, World"; 
    return temp; 
} 
5

첫 번째 경우 문자열은 항상 고정 된 주소의 상수 읽기 전용 메모리에 있습니다. 두 번째 경우에는 문자열이 스택에 로컬로 저장되므로 일시적입니다.

+0

나는 당신이 말한 것을 완전히 이해하지 못했습니다. 문자열 상수이기 때문에 컴파일러는 컴파일 타임에 이미 메모리를 할당 했으므로 문제가 발생하지 않는다고 말하고 있습니까? – Pratt

+0

예, 컴파일러는 고정 전역 주소에서 문자열을 정적으로 할당하고 있습니다. 나는 ouah에서 받아 들여진 응답과 동일한 것을 의미한다. – TJD

관련 문제