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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言堆和栈,静态区的理解相关的知识,希望对你有一定的参考价值。

静态区:保存自动全局变量和static 变量(包括static 全局和局部变量)。静态区的内容
在总个程序的生命周期内都存在,由编译器在编译的时候分配。
栈:保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容
也会自动被销毁。其特点是效率高,但空间大小有限。
堆:由malloc 系列函数或new 操作符分配的内存。其生命周期由free 或delete 决定。
在没有释放之前一直存在,直到程序结束。其特点是使用灵活,空间比较大,但容易出错。

这三个部分是分开的还是相互之间有交集,
int *fun1(int *p)
p=(int)malloc(4*sizeof(int));
return p;
int main()

int *a,*b;
int c[10]=0,0,0,0,0;
b=c;
a=fun(b);

a,b,q分别保存在什么地方

楼主问这样的问题,需要澄清平台。比如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等)
参考技术A  1、栈区(stack)—由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 分配方式 :定义于函数中的变量
2、堆区(heap) — 一般由程序员分配释放 , 若程序员不释放,程序结束时可能造成内存泄漏 。注意它与数据结构中的堆是两回事,分配方式:malloc,new出来的东西都是堆中
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(BSS)。 -程序结束后由系统释放 定义于函数外,或者用static修饰的变量 存放于静态区。
参考技术B 堆:由malloc 系列函数或new 操作符分配的内存。其生命周期由free 或delete 决定。
栈:保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。其特点是效率高,但空间大小有限。
静态区:保存自动全局变量和static 变量(包括static 全局和局部变量)。静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。
参考技术C a,和b肯定是在一起的,q,和a,b可以说是在一起,因为,a,q之间的地址在vc6.0上相差100,他们都是在线程栈里面分配的地址,p分配的地址就不在一起了,p是在进程的堆里面分配的追问

栈:保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容
也会自动被销毁。其特点是效率高,但空间大小有限。这个解释对不上

追答

是正确的,栈是与线程相关的,线程之间不能访问,但栈的大小最大一般为2m,不过也可以改变,堆是进程相关的,地址空间4g,不过栈也是在堆里面分配的,只是其它的线程不能访问

参考技术D 我觉得都是在栈里面,因为p属于形参,a,b属于局部变量,所以都在栈区分配内存!!

标准C -- 堆和栈

一、堆内存  

  1、就是程序员手动管理的一块内存,在C语言中,可以理解为用malloc、realloc等申请空间的一些函数,这些函数所申请的空间就是堆空间

  2、C语言中,堆空间是申请和释放 malloc/free 这两个函数来实现

  3、堆内存和物理空间的大小有关,如果物理空间够大的话,理论上,程序员可以申请足够大的内存

  4、无法和标志符建立连接,因此堆内存的申请一定需要用到指针来接受函数申请到后返回的内存地址

      例如:int* p = malloc(sizeof(int));此函数就申请了4个字节的内存空间

 

二、栈内存

  1、栈内存是系统管理的一块内存,他的内存大小有限,不过一般程序员正常使用时,都是足够大的

  2、栈内存的申请和释放都是系统进行管理的   例如:int  a=0;

  3、栈内存的存储数据的特点是先进后出原则

  4、栈内存的使用一般是在局部函数中,因为局部函数作用域一般比较短,因此栈的生命周期一般较短 

三、总结

  栈内存和堆内存的区别主要围绕:内存的生成和释放,内存空间的大小

    栈内存的优点:栈内存不存在内存管理者的错误,因为他是自动生成和释放的

    栈内存的缺点:栈内存的空间不大,存储数据的时间不长

    堆内存的优点:对内存的数据的保留受程序员控制

    堆内存的缺点:对无用的内存如果没有及时清理,有可能造成内存泄漏

      注:内存申请的速度上,栈内存要快于堆内存

      注:栈内存的生命周期一般较短,因为作用域的缘故

  

以上是关于c语言堆和栈,静态区的理解的主要内容,如果未能解决你的问题,请参考以下文章

C语言堆栈入门——堆和栈的区别

标准C -- 堆和栈

内存里的堆和栈只读区静态全局区

堆和栈

20经常说的堆和栈原来是这么回事.md

20经常说的堆和栈原来是这么回事.md