linux内存分析

1.在linux系统中,执行gcc命令是将我们的C语言程序转换成二进制可执行文件,其中linux的二进制可执行文件中,对每个对应的资源进行了划分,我们可以控制的主要有以下几种:

  1).data:用来存放已经初始化的全局变量或者static修饰的变量

  2).bss:用来存放未初始化的全局变量或者static修饰的变量

  3).init:程序的入口段落

  4).text:程序的可执行文本段落

  5).fini:程序的出口段落

  6).rodata:程序的常量段落

  7)堆:程序的临时变量存放区域

  8)栈:我们自己手动申请的内存区域

  9)映射段落:映射库以及其他资源的段落

  10)高地址命令行段落:用来存放运行程序的环境变量以及命令行参数

 总结:

  1)全局变量或者是static修饰的变量如果没有初始化,它们的值为0。

  2)局部变量的值在栈中,栈由于是自动分配以及释放的,如果它们没有赋初值,那么它们的值是不确定的。

  3)我们不应该定义太多全局变量,因为全局变量是在程序一开始就分配好内存的,伴随着程序终身,全局变量越多,程序就越臃肿。

  4)栈的内存大小默认是2-8M(当前的ubuntu是8M),所以临时变量不宜申请太多,如果需要用到大量的内存,建议用堆内存。

 2.堆内存的操作

  1.堆申请的内存是没有初始化的

  2.free清理掉的内存,它的指针并不会被清空,它的内容也不会被清空,只是我们不能够再用了,因为不知道什么时候这片内存回给别人用了,如果再去用这片内存,就会内存越界(内存泄漏经典题目)。

  3.申请的内存用完之后一定要释放,不然会一直占用着内存。

  4.操作的函数

    1)申请内存

      void *malloc(size_t size);

      void *calloc(size_t n,size_t size);//申请n块size这么大的内存

    2)释放内存

      void free(void *ptr);

    3)重置申请的内存大小

      void *realloc(void *ptr,size_t size);//ptr是已经申请的内存地址,size是要重置的大小,本身在内存中的数据是不会丢失的,成功之后返回新的内存地址,一定要替换ptr的值。

      例子:ptr = realloc(ptr,100);

3.作用域

  1)代码块作用域:在{ }里面定义的变量,只能够在{ }里面使用,在外面是访问不到的。(临时变量)

  2)函数原型作用域:在函数里面定义的变量,只能够在函数里使用。(临时变量)

  3)文件作用域:用static修饰的,只能够在当前文件使用。

PS:如果有错误麻烦指出来,大家互相学习 0-0

原文地址:https://www.cnblogs.com/smallqizhang/p/12359647.html