C程序中数据的内存分配【精心总结】._第1页
C程序中数据的内存分配【精心总结】._第2页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、内存分配一个由 C/C+ 编译的程序除了存放函数二进制代码的程序代码段( code 段)外,数据占用 的内存大致分为以下几个部分:1、栈区( stack)存放局部变量、函数参数、返回数据、返回地址等。系统自动分配释放 ,其操作方式类似 于数据结构中的栈。需要注意的有三点:第一, 退栈后销毁进栈时定义数据,请看下面这段。char* fun(char *p)char test = hello;p = test;return p;/下面是某调用函数中的代码char *a = world;printf(%sn,fun(a);输出的结果是什么? hello 还是 world?test数组是局部变量,当所

2、属函数被调用时,系统为之在栈区分配一段内存空间,存六 个字符以及一些记录信息, test 对应该段内存空间首地址,当一个参数即指针 p 传入时,将 test 的值赋给 p,而当函数调用结束的时候,发生退栈操作,刚才分配的内存被“销毁”,即写入“垃圾信息”。所以调用的结果是:给参数赋给了一个栈区地址,该地址指向的内存空间里是一堆垃 圾信息,所以输出结果既不是 hello 又不是 world 。第二,正是由于栈“后进先出”的特点,所以函数调用的机制是借助栈区来完成的,而 当我们进行大量频繁的调用操作时,系统将随之进行大量的进栈退栈操作,从而消耗时间资源, 使得程序的执行效率下降。C语言解决的方法是

3、使用宏来代替那些短小而被频繁调用的函数,而C+则是引入了内联函数机制。 除此之外, 还有就是提高编程技巧,注意细节, 比如这段代码,for (i=0; ifun();i+) 如果循环过程不改变 fun() 的取值的话,那么强烈建议将此代码调整为temp = fun();for (i=0; itemp; i+)/*由于减少了每次循环中调用函数所造成的进栈退栈开销,所以执行效率将大大提高。需 要类比的一个例子是循环嵌套, 同样为了降低开销, 建议在允许的情况下, 将循环次数多的循环 放在里面。第三,由于系统为栈分配的空间很有限,一般只有1M (可以调整设置) ,如果申请的栈空间太大,将会出现栈溢出

4、的错误。一次试验时,我用的机器上能分配的最大栈空间为 1036084byte, 也就是0.988M 。所以当在栈区定义“大数据”时,一定要敏感。2、堆区( heap)由程序员通过 malloc() 等函数分配释放,若程序员不释放,程序结束时可能由OS 回收。分配方式类似于链表。需要注意的有五点:第一, 分配后马上进行分配成功与否的验证。第二, 有分配必须有释放,否则将有可能造成内存泄露。遵循“谁分配谁释放”的原则。第三, 操作上, malloc 和 free 对应, new 和 delete 对应。另外,前者是库函数,使用时需 要加载相应头文件,后者是 C+ 中的关键字,是运算符,不需要加特别

5、的头文件。第四, 运行效率没有栈高,而且大量频繁使用将造成更多的内存碎片。第五, 虽然 free() 函数的参数是指针,但它释放的是内存而不是指针,所以当执行完free()操作后,还应该将指针置空,以避免野指针问题。3、全局区(静态区) ( static ) 存放全局变量、静态变量。程序结束后由系统释放。C程序根据全局变量和静态变量有没有进行显式初始化,还将它们分为两个不同的区域, 即 BSS 和DATA 。据说这种区别在 C+ 中已经没有了,而且编码规范要求我们在定义一个变量 时,一定要同时对它进行初始化(尤其是一个指针,最好将它置为空),所以我们尽量还是在允许的情况下,遵守这一规范。另外需

6、要特别说明的是,当没有进行显式初始化时,它们的值将被 初始化为0。当函数或外部变量的前面冠以 static 时,它们的可见范围将限定在所在文件内,程序中其他 文件无法见到它们,我们可以用这个办法来有效避免命名冲突。而当一个局部变量被static 修饰时,它的可见范围并没有修改,还是限定在函数内,但它的生存期将延长为程序生存期,因为存储区域不是栈区,所以不会因为退栈而被销毁。4、文字常量区 常量字符串就是放在这里的。 程序结束后由系统释放。常量, 顾名思义, 不可进行写操作, 关于这一点的注意事项, 请看下面这段错误代码;char *p = atbcdef;*(p+1) = b;程序运行时将报非法写入错误。 关于局部的字符串常量是存放在全局的常量区还是栈区,不同的编译器有不同的实现。可 以通过汇编语言查看一下。 VC 环境下 ,局部常量就像局部变量一样存储于栈中, 全局常量、字符 常量存储于文字常量区。 TC 在常量区。有人把常量区也归在了全局静态区,也有人把常量归在代码段,真是费解啊,我也不知道 归哪,哪天有空看一下汇编代码,深究一下吧,不过从编程的角度来考虑,似乎追究这个问题意 义不大。再强调两个问题:/栈和堆生长方向问题int i;int a5;for (i=0; i=5; i+)ai = 1;/内存对齐问题,st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论