【发布时间】:2012-12-22 23:03:36
【问题描述】:
可能重复:
Can a local variable’s memory be accessed outside its scope?
这是一个简单的代码,其中在 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);
}
编译日志:
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 返回“一些垃圾”,而 localIntPtr 和 localCharPtr 返回“预期”值。
但是,在函数 localStrPtr 中,如果我更改 [ "char str[20]" -to-> "char* str = (char* ) malloc (20)" ],localStrPtr 正确返回字符串“abcd”。这是运行日志,一旦进行了上述更改。
新的运行日志:
localStrPtr = abcd
localIntPtr = 8
localCharPtr = y
问题:
在函数 localIntPtr 和 localCharPtr 中,返回的局部变量地址的内容 WORKED,但对于函数 localStrPtr,正确的值返回 "only" 与 malloc,但不会与 local char字符串 [20]。为什么它不适用于 str[20] ?
-
为什么我们在 COMPILE LOG 中看到以下所有 3 个函数的行?
- stringManip.c:27: 警告:函数返回局部变量的地址
- stringManip.c:34: 警告:函数返回局部变量的地址
- stringManip.c:41:警告:函数返回局部变量的地址
【问题讨论】:
-
从不返回指向存储类为 auto 的数据的指针。 从不(或者 Kernigham 离开他的坟墓并杀了你)
-
现在有代码了!但是有什么问题吗...?
-
抱歉各位在我完成问题之前回答。 StackOverFlow 和 Chrome 似乎有问题。来自 Unix 的剪切和粘贴似乎不能在 1 件中工作。我应该一点一点地做,节省小块。在我保存和添加时,人们已经回复了一个不完整的帖子
标签: c++ c string heap-memory stack-memory