我有以下计划:
#include<stdio.h>
char * test()
{
char * rt="hello";
return rt;
}
void main()
{
printf("\n %s \n", test());
}
这里,如果rt不是像char rt [] =&#34;你好&#34;的常量指针,它会正确打印你好。它打印垃圾。我的理解,后一个堆栈在函数从测试返回时被释放但是上面的情况会发生什么? char * rt的内存在哪里分配?
扩展到上面部分,如果我尝试做char rt [] =&#34;你好&#34;如果我试试rt =&#34; hrer&#34;使用char * rt =&#34;你好&#34;它会抛出错误它工作正常,但我们不能在以后的情况下更改字符串中的特定字符。请帮我理解一下。感谢。
答案 0 :(得分:2)
您的字符串"hello"
就是所谓的字符串文字。它驻留在程序的所谓数据段中,这是一个内存区域。您的代码中的任何其他字符串文字也会放在那里。这个区域被装载一次,从未被破坏。
所以,你的指针rt
指向某个区域。
但是,如果声明char rt[] = "hello"
,则表示堆栈上名为rt[]
的数组,并且数组长度为6个字节(hello + null终止符)。当函数返回时,堆栈被释放,因此,这个内存将无效。
有关字符串文字的更多信息,请访问:C String literals: Where do they go?
答案 1 :(得分:1)
字符串Hello
被设置到程序可执行部分的读取部分。该函数返回指向该函数的指针。
使用数组(在第二种情况下)意味着它被复制到堆栈中。
它被摧毁的功能结束 - 因此垃圾