네! 문제가 생길 수 있습니다!
#include <stdio.h>
int* getArray()
{
int ret[5] = {1, 2, 3, 4, 5}; // 아래 그림은 여기에서의 콜 스택입니다.
return ret;
}
int main(int argc, char **argv)
{
int *arr = getArray(), i;
for(i = 0; i < 5; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}이렇게 사용하는 걸 말씀하신 것 같은데요, 이렇게 사용하면 안 되는 거 맞습니다.
콜 스택이 대충 이렇게 생겼는데요, (타블렛 펜을 잃어버렸습니다. 악필인 점 양해 부탁드립니다...)
위 그림에서 보라색과 초록색 사이는 getArray 함수가 끝나기 전까지만 유효합니다!
getArray 함수가 끝나고 main으로 돌아오면 (콜 스택의 끝이 파란색 화살표 부분으로...)
그 위에 있는 int ret[5]는 더 이상 유효한 게 아닙니다. 참조해서는 안 됩니다.
다른 함수롤 호출하면 값이 언제든지 덮어써질 수 있습니다.
#include <stdio.h> // getArray의 내용은 위와 다르지 않습니다.
int* getArray() { int ret[5] = {1, 2, 3, 4, 5}; return ret; }
void makeIt0()
{
int test[5] = {0, 0, 0, 0, 0};
}
int main(int argc, char **argv)
{
int *arr = getArray(), i;
makeIt0(); // 그냥 다른 함수롤 호출했을 뿐입니다.
for(i = 0; i < 5; i++)
{
printf("%d\n", arr[i]); // 이번에는 어떤 값이 나올까요? 두근두근...
}
return 0;
}실행 결과가 어떻게 나오나요? 저는 숫자 4개가 0 0 0 0으로 나오는군요!