Linux bss segment, data segment, text segment and stack segment , heap segment introduce

1. Now we study linux compile, we found that when we use "readelf -S" we can read the symbol in the exe.

 我们会发现在 在程序中会有 data bss text 和 read data 以及 heap stack 等段的概念。下面我们详细的讲一下个段的存放的那些变量。

 

  text 段: 存放的是指令 为只读的 不可在运行是 改变    --- 占用code size的大小

  data 段: 存放 初始化的全局变量 初始化为0和NULL的除外(包括 初始化的静态全局变量) 和 初始化的 局部静态变量  -- 占用code size

  bss 段: 存放 未初始化的全局变量(包括初始化成0 NULL)和 未初始化的 局部静态变量。 --不占用code size 他只进路所有bss的总的大小。在程序运行时 reserve 这麽大的 空间。

字符串常量: 一般存放在text 段

read data 段: 在data段中 只不过存放的是常量数据。

 

下面我们讲一下static 修饰符的作用。

  static 作用:

   1. 改变 变量的存储区(从 stack 上提到 bbs 或者data 段) 在局部变量上加一个static 修饰符就是这个作用。 虽然这个变量的作用域 还是在这个 局部区域 但当这个作用与失效时 这个变量的值依然存在(符号已经被注销了)。

 例如: 

     void test1(void)

     {

        static int a = 9; 

         int b = 8;

              // 虽然在test1 调用结束后, 符号 a,和符号 b 都不在符号表里了。但是a 的这个值9 还存在。 这就函数返回值的引用。

     }

   2. 限制作用域   加上 static 的全局变量 的作用与就不是全工作目录 就变成的定义他的文件又有效了。

      static int a;

      int c;

     void test()

  {

  }

  a 就只有在这个文件有效。

 c 可以全工程有效。

 

注意static 和extern 是相互排斥的。

 

 

 

 

 

 

 

 

  

 

 

你可能感兴趣的:(c,语言)