programing

C의 함수에서 로컬 변수 반환

muds 2023. 6. 10. 09:48
반응형

C의 함수에서 로컬 변수 반환

#include <stdio.h>

int foo1(void)
{
    int p;
    p = 99;
    return p;
}

char *foo2(void)
{
    char buffer[] = "test_123";
    return buffer;
}

int *foo3(void)
{
    int t[3] = {1,2,3};
    return t;
}

int main(void)
{
    int *p;
    char *s;

    printf("foo1: %d\n", foo1());
    printf("foo2: %s\n", foo2());
    printf("foo3: %d, %d, %d\n", p[0], p[1], p[2]);
    return 0;
}

이 파일을 컴파일할 때gcc -ansi -pedantic -W -Wall컴파일러가 foo2dll 및 foo3dll에 대해 경고 메시지를 표시합니다.

warning: function returns address of local variable

로컬 변수를 반환하는 것은 허용되지 않는다고 생각했지만 foo1()은 잘 작동하고 로컬 개체로 포인터를 반환하는 것과 개체 자체는 큰 차이가 있는 것 같습니다.

누가 이 문제를 밝혀줄 수 있습니까?잘 부탁드립니다!

여기서 문제는 로컬 변수를 생성할 때 스택에 할당되므로 함수 실행이 완료되면 사용할 수 없다는 것입니다(여기서는 구현이 다릅니다).선호하는 방법은 다음과 같습니다.malloc()로컬이 아닌 메모리를 예약합니다.여기서 위험은 할당 해제해야 한다는 것입니다.free()를 사용하여 할당한 모든 항목malloc()잊어버리면 메모리 누수가 발생합니다.

위해서foo1()로컬 변수 자체가 아닌 로컬 변수의 복사본을 반환합니다.

다른 함수의 경우 포인터의 복사본을 로컬 변수로 반환합니다.그러나 해당 로컬 변수는 함수가 완료되면 할당이 해제되므로 나중에 참조하려고 하면 심각한 문제가 발생합니다.

모든 변수에는 메모리에 약간의 공간이 있습니다.포인터가 해당 공간을 참조합니다.로컬 변수가 차지하는 공간은 함수 호출이 반환될 때 할당 해제됩니다. 즉, 함수 호출은 다른 작업에 재사용될 수 있고 앞으로도 재사용될 것입니다.결과적으로, 그 공간에 대한 언급은 완전히 관련이 없는 것을 가리키게 될 것입니다.C의 배열은 포인터로 구현되므로 이를 적용할 수 있습니다.함수에 선언된 상수 배열도 로컬로 계산됩니다.

배열이나 다른 포인터를 생성된 함수의 범위 밖에서 사용하려면 malloc을 사용하여 공간을 예약해야 합니다.malloc을 사용하여 예약된 공간은 무료 호출을 통해 명시적으로 해제될 때까지 재할당되거나 재사용되지 않습니다.

예, 초기화한 변수의 내용이 저장된 메모리 위치의 주소로 실제 배경 뒤의 포인터인 배열을 반환합니다.따라서 어레이 값 중 하나를 의미하는 경우에는 이러한 결과를 반환하는 것이 그다지 유용하지 않을 수 있음을 경고합니다.

언급URL : https://stackoverflow.com/questions/4824342/returning-a-local-variable-from-function-in-c

반응형