Q. C언어에서 함수 리턴시 리턴값을 배열로 하는 것이 위험할 수도 있나요?

꿀어기 2019. 04. 04.


C언어에서 함수 리턴 시 리턴값을 배열로 하는 것이 위험할 수가 있나요?
static을 붙여서 리턴시키는 법도 있더라구요.

지역변수 관련해서 문제가 생길까봐 애초에 배열 반환을 지양했습니다.

명확하게 정리되지 않아서 질문드립니다.

공유하고 보상받기 ♥︎
댓글 1
김형섭 2019.04.05 03:05

그 코드를 다시는 볼 일이 없고 수정할 일이 없다면 문제는 없을 것 같습니다.

유지보수 측면에서는 이후 수정 시 실수를 발생시킬 여지가 큰 거 같네

1개의 답변이 있습니다.

질문자 & 큐레이터 채택
프알못 답변자인증
익스트림 QA팀 2019. 04. 04
100%의 채택

네! 문제가 생길 수 있습니다!

#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으로 나오는군요!

댓글 0