이 코드가 유효 할까요?

loveme0721@gmail.com의 이미지

#include

void test(char **t)
{
printf("test t:0x%x [%s]\n", *t, *t);

*t = "redefine";

printf("test t:0x%x [%s]\n", *t, *t);
}

int main()
{
char *d = "define";
printf("main d:0x%x [%s]\n", d, d);

test(&d);

printf("main d:0x%x [%s]\n", d, d);

return 0;
}

runtime시에 test 함수에 재정의된 t가 test의 scope를 벗어나도 유효할까요?
제가 알기로는 stack에서 pop이 되기때문에 쓰레기 값으로 바뀔 수 있으니 그 값을 보장 할 수 없다인데요. 즉, t에 "redefine"라는 값은 나중에 어떤 쓰레깂에 의해 변경이 될 수 있다는게 맞지요?

라스코니의 이미지

char *d = "define";
*t = "redefine";

등의 문장에서 "define" 이나 "redefine" 의 문자열은 상수로 stack 과는 다른 메모리에 잡힙니다. BSS 이던가 그렇습니다.

그러므로 위의 코드는 잘 동작할 겁니다. 다만 "redefine" 등은 상수로 되어 있으므로 즉 read-only 라는 것입니다. 그러므로 "redefine" 을 "re__fine" 등으로 수정하는 것은 허용되지 않습니다.

요는 "redefine" 등은 stack 과는 별개의 것이라는 것입니다. test() 를 호출하면 stack 에는 d 의 포인터 값만 저장됩니다.