C언어에서 함수 리턴시 리턴값을 배열로 하는 것이 위험할 수도 있나요?
C언어에서 함수 리턴 시 리턴값을 배열로 하는 것이 위험할 수가 있나요?
static을 붙여서 리턴시키는 법도 있더라구요.
지역변수 관련해서 문제가 생길까봐 애초에 배열 반환을 지양했습니다.
명확하게 정리되지 않아서 질문드립니다.
55글자 더 채워주세요.
1개의 답변이 있어요!
네! 문제가 생길 수 있습니다!
#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으로 나오는군요!