从函数返回本地var字符串失败,而local var int和char工作正常.为什么?

Mik*_*ike 1 c c++ variables heap stack

可能重复:
区别 - 从函数返回'local'char*与从函数返回'local'int*

这是一个简单的代码,其中3个不同的函数[localStrPtr,localIntPtr,localCharPtr ]在它们各自的函数中返回指向它们的局部变量[string,integer,char]的指针.

码:

#include <stdio.h>

char*  localStrPtr (char*);
int*   localIntPtr (int, int);
char*  localCharPtr (char);

main()
{
    int *pInt;
    char *pChar;

    printf( "localStrPtr = %s\n", localStrPtr("abcd") );

    pInt = (int*) localIntPtr(3, 5);
    printf( "localIntPtr = %d\n", *pInt );

    pChar = (char*) localCharPtr('y');
    printf( "localCharPtr = %c\n", *pChar );
}

char* localStrPtr(char* argu)
{
    char str[20];
    // char* str = (char*) malloc (20);

    strcpy (str, argu);
    return str;
}

int* localIntPtr (int argu1, int argu2)
{
    int local;
    local = argu1 + argu2;
    return (&local);
}

char* localCharPtr (char argu)
{
    char local;
    local = argu;
    return (&local);
}
Run Code Online (Sandbox Code Playgroud)

编译日志:

stringManip.c: In function `localStrPtr':
stringManip.c:27: warning: function returns address of local variable
stringManip.c: In function `localIntPtr':
stringManip.c:34: warning: function returns address of local variable
stringManip.c: In function `localCharPtr':
stringManip.c:41: warning: function returns address of local variable
Run Code Online (Sandbox Code Playgroud)

运行日志:

localStrPtr =
localIntPtr = 8
localCharPtr = y
Run Code Online (Sandbox Code Playgroud)

正如您在日志文件中看到的那样,localStrPtr返回"some garbage",而localIntPtr和localCharPtr返回"expected"值.

但是,在函数localStrPtr中,如果我更改-to- char str[20]> char* str = (char*) malloc (20),localStrPtr会正确返回字符串"abcd".一旦进行了上述更改,这是RUN LOG.

新运行日志:

localStrPtr = abcd
localIntPtr = 8
localCharPtr = y
Run Code Online (Sandbox Code Playgroud)

问题:

[1]在函数localIntPtr和localCharPtr中,返回的局部变量的内容地址为WORKED,但是对于函数localStrPtr,正确的值使用malloc 返回,但不会使用local char str [20].当使用局部变量char和int时,为什么它不能与str [20]一起使用?

[2]为什么我们在COMPILE LOG中看到所有3个函数的下面几行?

  • stringManip.c:27:warning:函数返回局部变量的地址
  • stringManip.c:34:warning:函数返回局部变量的地址
  • stringManip.c:41:warning:函数返回局部变量的地址

Bos*_*ohn 8

您无法从函数返回局部变量.局部变量存在于堆栈中,一旦函数完成,该堆栈空间就会被释放,并可供下一个函数调用使用.

如果使用malloc,它会在堆上分配内存.当函数结束时,不会释放此内存,因此您可以返回它,并且该内存仍然在调用函数的空间中分配(这也是为什么malloc可能导致内存泄漏,但本地数组不会).

这并不像看起来那么清晰,因为返回值总是按值传递.如果返回一个本地int,它将返回该int的值,并且它可以正常工作.如果返回一个本地数组,它将返回指向该数组的指针的值,如果该指针不再指向内存的有用部分,则该指针将无法正常运行.