-1

我有以下程序:

#include<stdio.h>

char * test()
{
char * rt="hello";
return rt;

}

void main()
{
printf("\n %s \n", test());
}

在这里,它正确打印 hello 而如果 rt 不是像 char rt[]="hello" 这样的常量指针,它会打印垃圾。我的理解是,当函数从测试返回时,后一个堆栈被释放,但上述情况会发生什么?char *rt 的内存分配在哪里?

扩展上述部分,如果我尝试执行 char rt[]="hello" 并且如果我尝试 rt="hrer" 它会抛出错误,而使用 char *rt="hello" 它可以正常工作,但我们不能更改特定字符后一种情况的字符串。请帮助我理解它。谢谢。

4

2 回答 2

2

您的字符串"hello"就是所谓的字符串文字。它驻留在程序的所谓数据段中,这是一个内存区域。整个代码中的任何其他字符串文字也都放在那里。这个区域被加载一次,并且永远不会被破坏。

因此,您的指针rt指向该区域的某个位置。

但是,如果您声明char rt[] = "hello",则您声明了一个在堆栈上命名的数组rt[],并且该数组长 6 个字节(hello + null 终止符)。当函数返回时,堆栈被释放,因此,这块内存将是无效的。

有关字符串文字的更多信息在这里:C 字符串文字:它们去哪里?

于 2013-10-15T20:35:30.487 回答
1

字符串Hello被设置到程序可执行部分的读取部分。该函数返回一个指向它的指针。

数组的使用(在第二种情况下)意味着它被复制到堆栈上。

函数结束时它会被破坏 - 因此是垃圾

于 2013-10-15T20:28:26.880 回答