区别 – 从函数返回’local’char *与从函数返回’local’int *

可能重复:
可以在其范围之外访问局部变量的内存吗?

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

码:

#include  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); } 

编译日志:

 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 

运行日志:

 localStrPtr = localIntPtr = 8 localCharPtr = y 

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

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

新运行日志:

 localStrPtr = abcd localIntPtr = 8 localCharPtr = y 

问题:

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

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

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

在所有3种情况下,未定义的行为。 “未定义”包括它可能起作用的可能性。 或者看起来它正在发挥作用。 有时。

您将返回一个指向局部变量的指针,该变量在堆栈上分配。 当该变量超出范围时,该变量将不再保留,该变量将在函数返回时进行。 内容是否被改变,以及何时发生,都取决于运气。 正如你的情况一样,你很幸运,有几个案例,但不是另一个。 在另一天,编译器可能在内部做出了一些不同的选择,并且它的行为有所不同。 或者(可能)下次打喷嚏时数据会被覆盖。

不要这样做。