C程序的内存空间

一个C程序在内存空间里面主要包括以下几个部分:
1,代码段
2,数据段
3,栈
4,堆

代码访问代码段,数据段放静态和全局变量,函数参数和局部变量放在堆栈里面,堆里面存是malloc分配的区域
   堆栈里面是一个栈的结构,往里push东西的时候就小的数据就是向整形,浮点型这类基本的数据。但是stack有一个更大的单位,那就是stack frame,一个函数通常对应一个stack frame,在stack frame里面存放的依次是进入函数后执行的第一条指令地址,参数(一般是从右往左压入参数),局部变量。栈的分配方式又两种,一种是静态分配,编译器来分配。第二种是动态分配,调用malloca来进行分配,哲中动态分配的方式和heap的动态分配方式不太一样,在stack上分配的内存无须程序员自己回收。程序返回的时候,就回收了。
   heap是动态分配的,理论上来讲heap的空间可以很大,大到沾满整个空间,他是C/C++库函数提供的接口,而不向stack那样是操作系统原生的,所以heap比stack慢一些,操作系统有专门的stack register。
   stack是一块连续的区域,固定大小的,在编译时期确定,windows下默认的是2M,而heap是不连续的区域,当你new一个地址的时候,会去访问操作系统执行的一个free list,然后根据算法选定一块合适的区域然后分配的程序,记录到heap里面,会在这个端上记录大小,free的时候就可以根据地址来释放大小。
ffff   
   heap
   ----
   stack
0000
heap增长方向是向着地址增长方向,stack是向着地址减小的方向
 
资料:
  http://blog.csdn.net/rujielaisusan/article/details/4622197
  http://blog.csdn.net/yeyuangen/article/details/6766567

时间: 2024-10-24 10:42:03

C程序的内存空间的相关文章

程序的内存空间 堆空间和栈空间的区别

一个由C/C++编译的程序占用的内存分为以下几个部分: 1.栈区(stack): 由编译器自动分配释放,其操作方式类似于数据结构的栈. 用于存放函数的参数值,用户程序临时创建的局部变量等,即函数括号"{}"中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量).除此之外,在函数被调用时,其参数也会被压入发起调用的进程栈中,等到调用结束后,函数的返回值也会被存放回栈中. 由于栈的后进先出特点,所以栈特别方便用来保存/恢复调用现场.从这个意义上讲,可以把栈看成

[转载]C语言程序的内存分配方式

"声明一个数组时,编译器将根据声明所指定的元素数量为数量为数组保留内存空间."其实就是编译器在编译的过程中,会加入几条汇编指令在程序里处理内存分配,并不是说编译时就分配了内存,不要理解错了. ------------------- 1.内存分配方式 内存分配方式有三种: [1]从静态存 储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. [2]在栈上创建. 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结

转:程序内存空间(代码段、数据段、堆栈段)

https://blog.csdn.net/ywcpig/article/details/52303745 在冯诺依曼的体系结构中,一个进程必须有:代码段,堆栈段,数据段. 进程的虚拟地址空间图示如下: BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域.数据

C语言程序的内存布局

一:C语言程序的存储区域 C语言编写的程序经过编绎-链接后,将形成一个统一的文件,它由几个部分组成,在程序运行时又会产生几个其他部分,各个部分代表了不同的存储区域: 1.代码段(Code or Text): 代码段由程序中的机器码组成.在C语言中,程序语句进行编译后,形成机器代码.在执行程序的过程中,CPU的程序计数器指向代码段的每一条代码,并由处理器依次运行. 2.只读数据段(RO data): 只读数据段是程序使用的一些不会被更改的数据,使用这些数方式类似查表式的操作,由于这些变量不需要更改

Linux内存点滴:用户进程内存空间

原文出处:PerfGeeks 经常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的.VIRT , Virtual Image (kb)RES, Resident size (kb)SHR, Shared Mem size (kb)%MEM, Memory usage(kb)SWAP, Swapped size (kb)CODE, Code size (kb)DATA, Data+Stack size (kb)nFLT, Page Fault countn

程序的内存分配

本人收集整理!感觉非常经典,,与众人阅之! 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack):由编译器自动分配释放 ,站的特点是空间小但被CPU访问的速度快,使用户存放程序中临时创建的变量.由于桟的后进后出的特点,所以桟特别方便用来保存和恢复调用现场.用于存储占用空间长度不变并且占用空间小的数据类型的内存段,而相同类型的数据占用的空间是等长的,其操作方式类似于数据结构中的栈. 2.堆区(heap):它大小并不固定,可动态扩张或缩减.用于存放数据长度可变或内存占用较大的

汇编语言 使用内存空间

汇编语言 使用内存空间 在上一个实验我们已经知道,c语言使用寄存器需要我们给出相应寄存器的名称,在函数执行过程中就能一一对应. 下面,我们来研究c语言如何使用内存空间: 我们已经知道像偏移地址2000h中写入一个字节的内容,我们用如下方法: *(char *)0x2000='a'; 像2000:0写入一个字节用如下方法: *(char far *)0x20000000='a'; 有了上面两点知识下面进行试验: 1.编写一个程序um1.c 编译.链接生成.exe文件,然后用debug加载,对mai

关于内存地址和内存空间的理解。

1.内存地址用4位16进制和8位16进制表示的区别.例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001.都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是用8位16进制表示呢? 首先,必须要知道内存地址只是一个编号,代表一个内存空间.那么这个空间是多大呢?原来在计算机中存储器的容量是以字节为基本单位的.也就是说一个内存地址代表一个字节(8bit)的存储空间. 例如经常说32位的操作系统最多支持4GB的内存空间,也就是

C++中的类所占内存空间总结

C++中的类所占内存空间总结 最近在复习c++的一些基础,感觉这篇文章很不错,转载来,大家看看! 类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算在内的. 摘抄部分: 成员函数还是以一般的函数一样的存在.a.fun()是通过fun(a.this)来调用的.所谓成员函数只是在名义上是类里的.其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码.而我们访问类的成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table