2017-04-19 2 views
0

다음 프로그램에서 문자열 리터럴 "zero""non-zero"의 수명은 어떻게됩니까?C에서 문자열 리터럴의 수명은 어떻게됩니까?

#include <stdlib.h> 
#include <stdio.h> 

const char* tester(int inp) 
{ 
    const char *retval=NULL; 

    if (inp==0) 
     retval="zero"; 
    else 
     retval="non-zero"; 

    return retval; 
} 

int main() 
{ 
    const char *outval=NULL; 

    outval=tester(0); 
    printf("0 is %s\n",outval); 
    outval=tester(1); 
    printf("1 is %s\n",outval); 

    return EXIT_SUCCESS; 
} 

내가 "zero""non-zero"가 (또는 적어도 할 수 있습니다)되어 this question in the C FAQ list에서 알고 읽기 전용입니다. 나는 그것이 "... discards 'const'qualifier ..."에 대한 컴파일러의 경고를 막기 위해 char* 선언 앞에 const을 넣어야 만했던 이유라고 생각합니다. 프로그램이

0의 예상 결과를 제공하는 동안 그러나 제로

1은 비 - 제로

나는 또한 tester가 정의 할 수 없음을 알고 :

char* tester(int inp) 
{ 
    char retval[9]; 

    if (inp==0) 
     strcpy(retval,"zero"); 
    else 
     strcpy(retval,"non-zero"); 

    return retval; 
} 
배열 retvaltester이 종료 될 때 처리되어야한다고 가정해야하기 때문에

입니다.

원래 코드에서 수행 한 작업을 수행 할 수 있습니까? 아니면 malloc을 사용해야합니까?

+0

'const'는 읽기 전용을 의미하지 않습니다. C에는'enum' 상수 이외의 기호 상수가 없습니다. – Olaf

+0

자동 변수에서 상수를 복사하면 반환 변수를 사용하면 수명이 단축됩니다! 포인터에 할당이 작동합니다. –

답변

1

문자열 리터럴은 정적 저장 기간 (예 : 수명이 프로그램 실행 시간 임)을 갖습니다.

C 표준의 §6.4.5/6을 참조하십시오.

+2

[여기가 어디입니까?] (http://port70.net/~nsz/c/c11/n1570.html#6.4.5p5) –

+0

@eugene : 오타가 수정되었으며 (6 페이지에 있음) 링크가 추가되었습니다. html에 감사드립니다. – rici

관련 문제