[转]网上看到的关于C中内存分配的描述

1栈   -   有编译器自动分配释放   
  2堆   -   一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收   
  3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静   
  态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。   
    -   程序结束释放   
  4另外还有一个专门放常量的地方。   -   程序结束释放   
  在函数体中定义的变量通常是在栈上,用malloc,   calloc,   realloc等分配内存的函数分   
  配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪   
  里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,   
  不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,   
  函数中的"adgfdf"这样的字符串存放在常量区。   
  比如:   
  int   a   =   0;   全局初始化区   
  char   *p1;   全局未初始化区   
  main()   
  {   
  int   b;   栈   
  char   s[]   =   "abc";栈   
  char   *p2;   栈   
  char   *p3   =   "123456";   123456\0在常量区,p3在栈上。   
  static   int   c   =0;   全局(静态)初始化区   
  p1   =   (char   *)malloc(10);   
  p2   =   (char   *)malloc(20);   
  分配得来得10和20字节的区域就在堆区。   
  strcpy(p1,   "123456");   123456\0放在常量区,编译器可能会将它与p3所指向的"12345   
  6"优化成一块。   
  }   
  还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。   
  栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和   
  递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有   
  的栈空间。栈是由编译器自动管理的,不用你操心。   
  堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。   
  并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时   
  是寻找匹配的内存的。而用栈则不会产生碎片。   
  在栈上存取数据比通过指针在堆上存取数据快些。   
  一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap.   
  栈是先入后出的,一般是由高地址向低地址生长。

[转]网上看到的关于C中内存分配的描述

时间: 2024-10-13 17:20:28

[转]网上看到的关于C中内存分配的描述的相关文章

内核中内存分配--关于高端内存

Linux把物理内存划分为了三个管理区, 分别为0-16MB的ZONE_DMA, 16-896MB的ZONE_NORMAL和高于896MB的ZONE_HIGHMEM也就是高端内存. 至于为什么这么划分, ZONE_DMA好理解, 因为ISA总线只能对前16MB进行DMA寻址, 这块要分出来不能乱用. 而ZONE_NORMAL和ZONE_HIGHMEM为什么从896MB区分呢? 这还得从物理地址和虚拟地址说起. 默认情况下, 内核空间是指3GB-4GB的虚拟地址, 用户空间则是0-3GB. 内核进

C语言中内存分配

C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重点介绍C程序中内存的分配,以及C语言编译后的可执行程序的存储结构和运行结构,同时还介绍了堆空间和栈空间的用途及区别. 第2节主要介绍C语言中内存分配及释放函数.函数的功能,以及如何调用这些函数申请/释放内存空间及其注意事项. 3.1 内存管理基本概念 3.1.1 C程序内存分配 1

C语言中内存分配 (转)

在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重点介绍C程序中内存的分配,以及C语言编译后的可执行程序的存储结构和运行结构,同时还介绍了堆空间和栈空间的用途及区别. 第2节主要介绍C语言中内存分配及释放函数.函数的功能,以及如何调用这些函数申请/释放内存空间及其注意事项. 3.1 内存管理基本概念 3.1.1 C程序内存分配 1.C程序结构 下面

【转】C语言中内存分配

原文:C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重点介绍C程序中内存的分配,以及C语言编译后的可执行程序的存储结构和运行结构,同时还介绍了堆空间和栈空间的用途及区别. 第2节主要介绍C语言中内存分配及释放函数.函数的功能,以及如何调用这些函数申请/释放内存空间及其注意事项. 3.1 内存管理基本概念 3.1.1 C程序内存分

java中内存分配策略及堆和栈的比较

2.1 内存分配策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求. 栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区

C语言中内存分配那些事儿

C程序的内存结构 C语言的之所以复杂,首先它的内存模型功不可没.不像某些那样的高级语言只需要在使用对象的时候,用new创建.所有之后的事情,你不需要操心.对于C语言,所有与内存相关的东西,都需要熟悉,否则,时间一久,总会踩着雷.下图是典型的一个C程序的内存结构,当然还有一个重要的前提,这样的一种布局是在虚拟内存中的: 关于虚拟内存内核维护了一个页表(page table),用来表示虚拟内存对物理内存地址或者磁盘(交换区,swap area)间的一种映射关系.并非所有的虚拟地址都需要在物理内存上映

C++中内存分配

程序在的内存中的分配(常量,局部变量,全局变量,程序代码) 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域.- 程序结束释放4.另外还有一个专门放常量的地方.- 程序结束释放                                          

Java中内存分配方式

摘自 Think in java 1.寄存器 这是最快的存储区,它位于处理器的内部,不能人为控制. 2.堆栈     位于RAM,但可以通过堆栈指针从处理器那里获取直接支持.堆栈指针向下移动,就分配新的内存,向上移动,则释放那些内存.这种方式分配内存快速有效,仅次于寄存器. 所以java必须知道存储在堆栈内所有对象的确切生命周期.对象引用 和 基本数据类型会放到堆栈中. 3.堆         一种通过的内存池,也位于RAM.用于存放所有的java对象.堆和堆栈的区别就在于编译器不需要知道数据在

C中内存分配方式[转载]

在C 中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 一.简介: 1.栈,就是那些由编译器在需要的时候分配,在无需的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等. 2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程式去控制,一般一个new就要对应一个delete.假如程式员没有释放掉,那么在程式结束后,操作系统会自动回收. 3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,但是他是用free来