可能重复:
Can a local variable’s memory be accessed outside its scope?
这是一个简单的代码,其中3个不同的函数 [localStrPtr,localIntPtr,localCharPtr] 返回指向其局部变量 [string,integer,char] 的指针他们各自的职能。
CODE:
#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);
}
COMPILE LOG:
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-&gt; “ char * str =(char *)malloc(20)”],localStrPtr正确返回字符串“abcd”。一旦进行了上述更改,这是RUN LOG。
NEW RUN LOG:
localStrPtr = abcd
localIntPtr = 8
localCharPtr = y
问题:
在函数localIntPtr和localCharPtr中,返回的局部变量的内容解决了WORKED,但是对于函数localStrPtr,使用malloc返回正确的值“only”,但是不会使用local char STR [20]。为什么它不适用于str [20]?
为什么我们在COMPILE LOG中看到所有3个函数的下面几行?
答案 0 :(得分:2)
未定义的行为,在所有3种情况下。 “未定义”包括它可能起作用的可能性。或者看起来它正在发挥作用。有时。
您将返回一个指向局部变量的指针,该局部变量在堆栈上分配。当该变量超出范围时,该变量将不再保留,该变量将在函数返回时进行。内容是否被改变,以及何时发生,都归结为运气。正如你的情况一样,你很幸运有几个案例,但不是另一个案例。在另一天,编译器可能在内部做出了一些不同的选择,并且它的行为有所不同。或者(可能)下次打喷嚏时数据会被覆盖。
不要这样做。