指针的内存分配

时间:2013-10-15 20:24:44

标签: c pointers memory-management

我有以下计划:

#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;它会抛出错误它工作正常,但我们不能在以后的情况下更改字符串中的特定字符。请帮我理解一下。感谢。

2 个答案:

答案 0 :(得分:2)

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

所以,你的指针rt指向某个区域。

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

有关字符串文字的更多信息,请访问:C String literals: Where do they go?

答案 1 :(得分:1)

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

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

它被摧毁的功能结束 - 因此垃圾