warning: function returns address of local variable

lemonday의 이미지

다음과 같은 코드로 실행을 해보니

char *kkk(char *mm)
{
char abc[100];

strncpy(abc,mm,100);
return abc;
}

int main()
{
char *mm = "abc";

printf("%s\n",kkk(char*)mm));

return 0;
}

함수 kk에서 return abc 에 warning: function returns address of local variable
이런 warning이 뜨내요.
또한 출력문 역시 원치 않는 값이 출력됩니다.

이유를 알고 싶습니다.

godyang의 이미지

안녕하세요?

kkk 함수 내에 선언된 abc[] 변수는 Local Variable입니다.
즉, 스택에 선언되므로 함수 내에서만, 또는 서브 함수 내에서만 유효합니다.

따라서 리턴되면 스택이 Pop되므로, abc의 내용이 다른 요소에 의해 Overwrite될 수 있습니다.

해결책은 malloc과 같은 메모리 할당 프로그램을 이용해서 Heap에 메모리를 할당하거나, static이나 extern 변수를 쓰시면 됩니다.

그럼...

익명 사용자의 이미지

음, 제가 쓰는 사이 다른 분이 이미 답변을 해주셨네요. 8)

한가지 중요한 것은 이 문제를 피하기 위해 전역 변수를 쓰는 것은 대부분의 경우 안좋은 프로그래밍 습관이란 점입니다. 가능한한 동적 할당으로 해결하는 것이 좋습니다.

alfalf의 이미지

저는 위와 같은 경우에 processing한 결과 문자열을 strdup 함수를 써서
문자열을 새로운 공간에 할당한 후 그 포인터를 리턴해서 사용하고
나중에 사용이 끝나면 free()로 해제 시킴니다.

추신) 제 방법이 맞는 건가요? ^^:

B00m의 이미지

alfalf wrote:
저는 위와 같은 경우에 processing한 결과 문자열을 strdup 함수를 써서
문자열을 새로운 공간에 할당한 후 그 포인터를 리턴해서 사용하고
나중에 사용이 끝나면 free()로 해제 시킴니다.

추신) 제 방법이 맞는 건가요? ^^:

이 방법은 별로 좋은 방법은 아닙니다.

메모리를 잡고 해제하는 것은 같은 루틴 안해서 하는 것이 좋습니다.

그래야 코드가 좀 더 깔금해 지고 나중에 수정도 쉽습니다.

저같으면 꼭 이렇게 써야 하는 경우라면 그냥 static 으로 잡아 쓰겠습니다.

일반적으로는 이런 경우 인자로 버퍼도 같이 넘겨 주는 것이 좋습니다.