我试图了解在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程序的布局吗?
答案 0 :(得分:1)
这取决于您的平台,它是实现定义的。一般情况下,如果您的系统可用,它会转到只读内存。阅读更多here。
正如您所指出的,当函数终止时,自动变量将消失,导致内存泄漏,但仅限于动态分配内存的情况!
这意味着您必须让temp
与其来电者通信main()
(例如free()
),以便您稍后free()
。或者,如果在函数完成其工作后不需要它,那么在退出函数之前{{1}}就可以了。
顺便说一下,正如iharob所说:Do I cast the result of malloc? NO!
答案 1 :(得分:0)
在标准C术语中,有四种可能的存储持续时间:
b
)"Hello world"
)malloc(15)
分配的空间)您在问题中询问的其他内容是特定编译器和平台的属性。有些设置没有堆栈,没有堆,没有数据段或.data或.bss段,依此类推。
进一步阅读: