【发布时间】:2011-09-22 22:59:04
【问题描述】:
在运行 c 程序时,我试图了解事物在内存中的存储位置(堆栈/堆,还有其他吗?)。编译它会给出警告:局部变量的函数返回地址:
char *giveString (void)
{
char string[] = "Test";
return string;
}
int main (void)
{
char *string = giveString ();
printf ("%s\n", string);
}
运行会给出各种结果,它只会打印出乱码。我从中收集到,在 giveString() 中称为 string 的 char 数组在运行时存储在 giveString() 函数的堆栈帧中。但是,如果我将 giveString() 中的字符串类型从 char 数组更改为 char 指针:
char *string = "Test";
我没有收到任何警告,程序打印出“测试”。那么这是否意味着字符串“Test”现在位于堆上?它似乎不再出现在 giveString() 的堆栈帧中。这两种情况到底发生了什么?如果这个字符串位于堆上,所以程序的所有部分都可以通过指针访问它,在程序终止之前它永远不会被释放吗?或者如果没有指向它的指针,是否会释放内存空间,就像我没有将指针返回给 main 一样? (但这只有在 Java 中这样的垃圾收集器才有可能,对吧?)这是堆分配的一种特殊情况,仅适用于指向常量字符串(硬编码字符串)的指针吗?
【问题讨论】: