zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Log4net<转载>
    XSD使用《转载》
    assemble文件中配置
    常用工具《收藏》
    mysql查看所有存储过程,函数,视图,触发器,表《转》
    log4g net 配置
    XSLT使用<转载>
    C#操作xml之xpath语法<收藏>
    如何做镜像服务器
    Android开发之旅:环境搭建及HelloWorld
  • 原文地址:https://www.cnblogs.com/smallqizhang/p/12359647.html
Copyright © 2011-2022 走看看