함수의 리턴값으로 문자열 배열 초기화

dolong의 이미지

안녕하세요.

문자열 배열을 초기화 할때
char* txt[] = { "헤헤" , "호호", "히히" };

요런식으로 자주 하곤 합니다.

헌데 , 얼마전에

char* txt[] = { "헤헤", getText(1), getText(2) };

이런 문구를 보고 화들짝 놀랐습니다.

동적 초기화도 아니고 , 선언시 초기화 인데 , 함수의 리턴값 이라니???!?!?

char* getText(int idx)
{
    ....
    return p_str;
}
 
void test(void)
{
    char* txt[] = { "헤헤", getText(1), getText(2) };
    ...
}

vc에서도 xcode 에서도 정상적으로 동작하더군요.

지역변수니까 함수 실행시점에서 메모리에 인스트럭션이 올라가고 배열의 초기화 시점에서 함수의 리턴값은 그저 문자열의 첫 주소값인 상수라고 인식하는 걸까요?

몹시 궁금합니다.!

이런

bootmeta의 이미지

사용하는 compiler가 C99의 "Non-Constant Initializers for Aggregate Types" 지원하면 ok,
그렇지 않으면 error

http://zone.ni.com/devzone/cda/tut/p/id/8764#toc6

http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Initializers.html#Initializers