2013-05-10 3 views
0

아래의 C 코드는 UB입니까? 쓰레기 값에 액세스 할 수 있습니까? 그렇다면 static function이 제대로 작동합니까?이것은 정의되지 않은 동작입니까?

const char *foo_name(int x){ 
    switch(x) { 
     case FOO: return "foo"; 
     case BAA: return "baa"; 
     default: return "unknow"; 
    } 
} 

printf("%s\n",foo_name(FOO));이 C 표준에 따라 정상적으로 표시되면 다소 혼란 스럽습니다.

+2

왜 정의되지 않습니까? 쓰레기 값에 액세스하지 않습니다. –

+0

문자열은 포인터를 반환하고 있습니다. 그 쓰레기 값이 아니라 ... 또한 바 철자가 잘못되었습니다 – cmd

+0

@ 잭 : 구체적으로 당신의 질문은 무엇입니까? UB의 기능을 정확히 의심하게 만드는 것은 무엇입니까? – AnT

답변

8

문자열 리터럴은 정적 저장 기간을 가지며 프로그램 수명 기간 동안 존재합니다. 코드에는 정의되지 않은 동작이 없습니다.

3

여기에 UB가 없습니다. 표준은 문자열 리터럴에 정적 저장 기간이 있음을 나타냅니다.

그렇다면 static 기능이 제대로 작동합니까?

수정 자는 기능이 완전히 다른 것을 의미합니다. 즉, (분명히 존재하지 않는) 문제는 해결되지 않습니다.

관련 문제