×

malloc是堆还是栈内存

malloc是堆还是栈内存(c语言堆和栈,静态区的理解)

admin admin 发表于2024-03-22 20:37:24 浏览22 评论0

抢沙发发表评论

大家好,如果您还对malloc是堆还是栈内存不太了解,没有关系,今天就由本站为大家分享malloc是堆还是栈内存的知识,包括c语言堆和栈,静态区的理解的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

本文目录

c语言堆和栈,静态区的理解

楼主问这样的问题,需要澄清平台。比如windows下的与linux下的编译器及很多嵌入式C编译器不同。为什么考虑嵌入式C?原因是目前C语言的很大市场在嵌入式领域。windows下,除了某些特殊需要,java,C++,C#已经优势尽显了。另外,讨论了半天,q在你代码的那里?我怎么没找到??我眼睛都揉红了也没找见呀只好表述一下原理VC下:1. 函数形参和函数内部非静态局部变量都在栈上分配(所以a,b,p本身都在栈上。但p指向的内容在堆上。q在哪里,我找不到)。栈的分配的方法是:sp-=字数。sp是堆栈指针。”字数“是说:你分配一个字节的局部变量,编译器也给你一个字的长度的空间。原因是,堆栈是具有字长度的。16位、32位机器下,字长度为16,64位机器下,字长度为32.而且,windows下,栈是从高地址向低地址增长的。为什么?栈与堆共享空间,并且,堆从低向高长,栈从高向低长,降低溢出风险。静态区名字本身就说明了他的特性:静止的,不随程序的运行变化。也就是相对的说,堆和栈都是动态的。静态区是编译器在编译时指定长度、链接时定位地址、windows载入器载入时分配内存。这里的动与静是编译器和链接器的说法,是语言层面。不适用于系统层面。Windows随时可能将任何用户程序程序的全部资源“请出”内存,也可重新载入,此时,什么静都是浮云。还有返回值。楼主的main不返回值编译器会警告你的。返回值存在什么地方?答案是寄存器里AX(EAX,DX,EDX等)。嵌入式系统里可能这些都不适用。比如,某些嵌入式处理器的形参直接使用寄存器(R0~R15,或A、B等)

栈)和用malloc(动态分配 堆)的区别

栈(stack)是由系统为程序运行自动分配和管理,如为局部变量分配空间。而堆(heap)是由程序员在代码中主动向系统申请分配的空间,如由malloc分配的空间。栈不需要程序员手动释放其分配的空间,而堆是需要程序员在代码中主动释放(free)其申请分配的内存空间,否则会导致内存泄漏。

什么是栈和为什么malloc防止它泛滥

说起来,没有完全看懂你的问题的后半部分“为什么malloc防止它泛滥”。

就你的问题中的两个重要名称:栈和malloc聊聊。

“栈”和“堆”,是程序运行中的两类重要内存管理和使用类型。

“栈”:操作比较有规律,一定是“先入后出”。进入栈,叫“压入”,出栈,叫“弹出”。

“堆”,则是另外一种内存类型。它通常被分为“块”,然后分别链成两个(链)表:“空闲”的和“使用”的。

malloc()函数,就是在“空闲”表中,找到一个需要大小的“块”,并返回该快内存的地址指针。相应的内存块,即被标识成“使用”的。

malloc()取得的内存块,在使用完毕后,需用free()把该内存块,放回“空闲”表。否则,空闲内存越来越少,以后就没有了,从而造成“内存不足”的错误。

栈和堆,大体构成了整个可使用内存。对于内存很小的嵌入式应用,合理分配两者的大小是很重要的,否则可能因为某一类型的不足,而造成程序无法正常运行。

希望我说明白了。如果“为什么malloc防止它泛滥”真有所指,请继续提问,咱们继续聊。谢谢。

OK,关于malloc是堆还是栈内存和c语言堆和栈,静态区的理解的内容到此结束了,希望对大家有所帮助。