在c中为不可变字符串分配的内存在哪里?

时间:2016-08-25 19:52:32

标签: c pointers memory-management dynamic-memory-allocation string-literals

我试图了解在c程序中分配内存的位置。

void func1(char e, int f, int g)
{
    int b = 4;
    char * s = "hello world";
    char * temp = (char *) malloc(15); 

}

据我了解,堆栈b,s和temp上分配了三个自动变量。其中b(4)的内容存储在堆栈中,指针s和temp存储在堆栈中,temp的数据存储在堆中,但是存储的数据在哪里?因为当我们离开func1调用时,b,s和temp将消失,但内容的内存已被永久分配。我的其他问题是堆栈指针总是向下移动4,就像推动函数参数一样,即使在一个字节的char的情况下? 堆栈看起来像这样,即使e只有一个字节?

30:// other stuff
26: g
22: f
18: e

http://www.firmcodes.com/wp-content/uploads/2014/08/memory.png 这不是c程序的布局吗?

2 个答案:

答案 0 :(得分:1)

这取决于您的平台,它是实现定义的。一般情况下,如果您的系统可用,它会转到只读内存。阅读更多here

正如您所指出的,当函数终止时,自动变量将消失,导致内存泄漏,但仅限于动态分配内存的情况

这意味着您必须让temp与其来电者通信main()(例如free()),以便您稍后free()。或者,如果在函数完成其工作后不需要它,那么在退出函数之前{{1}}就可以了。

顺便说一下,正如iharob所说:Do I cast the result of malloc? NO!

至于你的另一个问题,应该是一个新问题,请阅读thisthis,这些问题可能有所帮助。

答案 1 :(得分:0)

在标准C术语中,有四种可能的存储持续时间:

  • 自动(b
  • 静态("Hello world"
  • 动态(由malloc(15)分配的空间)
  • 螺纹

您在问题中询问的其他内容是特定编译器和平台的属性。有些设置没有堆栈,没有堆,没有数据段或.data或.bss段,依此类推。

进一步阅读: