C语言 百分网手机站

C语言变量存储布局

时间:2020-10-04 08:20:51 C语言 我要投稿

C语言变量存储布局

  C语言变量是怎么储存的大家了解吗?下面一起去了解一下C语言变量存储布局是怎么样的吧,希望对大家有帮助!

  1.正文段(.text):机器指令部分,是只读的,防止意外的修改;

  2.初始化数据段(.data):保存程序中的全局变量且已被赋初值或在函数中被static修饰的且已被赋初值的变量;

  3.未初始化数据段(.bss):保存程序中的全局变量且未被赋初值或在函数中被static修饰的且未被赋初值的变量,这些变量由内核赋初值0;

  4.堆:通常由程序员进行申请,最后进行释放;

  5.栈:存放函数中的临时变量,函数调用时给变量分配内存,函数释放时释放内存。

  下面以实际的.例子来分析变量存储空间:

  #include

  const int A = 10;

  int a = 20;

  static int b = 30;

  int c;

  int main(void)

  {

  static int a = 40;

  char b[] = "forward";

  register int c = 50;

  printf("Hello World %d ", c);

  return 0;

  }

  1.全局变量A用const修饰,表示A是只读的,不可修改,它的地址位于.rodata段;注意,像A这种const变量在定义时必须初始化。因为只有初始化时才有机会给它一个值,一旦定义之后就不能再改写了,也就是不能再赋值了;

  2.程序中的字符串字面值"Helloworld%d "分配在.rodata段的末尾,字符串字面值是只读的,相当于在全局作用域定义了一个const数组:

  const char helloworld[] = {'H', 'e', 'l', 'l', 'o', ' ', 'w','o', 'r', 'l', 'd', ' ', '%', 'd', ' ', ''};

  程序加载运行时,.rodata段和.text段通常合并到一个Segment中,操作系统将这个Segment的页面只读保护起来,防止意外的改写;

  3.全局变量a,b及函数中用static修饰的变量a;都位于.data段中;都是初始化了得数据;

  4.全局变量c未被初始化,位于.bss段;由exec初始化为0,所以为初始化的全局变量默认值为0,函数内的static变量若没有被初始化,也位域该段,默认值为0;.data和.bss在加载时合并到一个Segment中;

  5.函数中的字符数组b,分配在栈中,函数中变量c并没有在栈上分配存储空间,而是直接存在eax寄存器里,后面调用printf也是直接从eax寄存器里取出c的值当参数压栈,这就是register关键字的作用,指示编译器尽可能分配一个寄存器来存储这个变量。

  存储修饰符

  1.static修饰全局变量或者函数表示该变量或函数的作用域为该本文件内;

  2.static修饰局部变量,该变量作用域仍然是函数内,但是它并不是在调用函数时分配,在函数返回时释放,而是像全局变量一样静态分配,只初始化一次;

  3.auto,用它修饰的变量在函数调用时自动在栈上分配存储空间,函数返回时自动释放,例如上例中main函数里的b其实就是用auto修饰的,只不过auto可以省略不写,auto不能修饰文件作用域的变量;

  4.register,编译器对于用register修饰的变量会尽可能分配一个专门的寄存器来存储,但如果实在分配不开寄存器,编译器就把它当auto变量处理了,register不能修饰文件作用域的变量(全局变量)。

  5.extern,extern关键字用于多个文件中声明同一个标识符;

  变量的生存期

  1.静态生存期,具有外部或内部链接属性,或者被static修饰的变量,在程序开始执行时分配和初始化一次,此后便一直存在直到程序结束。这种变量通常位于.rodata,.data或.bss段(静态区域),例如上例中main函数外的A,a,b,c,以及main函数里的a。

  2.自动生存期,链接属性为无链接并且没有被static修饰的变量,这种变量在进入块作用域时在栈上或寄存器中分配,在退出块作用域时释放。例如上例中main函数里的b和c。

  3.动态分配生存期,调用malloc函数在进程的堆空间(动态区域)中分配内存,调用free函数可以释放这种存储空间。

【C语言变量存储布局】相关文章:

C语言变量定义02-27

C语言变量理解12-06

关于C语言变量理解11-18

C语言变量的地址12-08

C语言顺序存储结构11-16

C语言局部变量和全局变量12-14

c语言中什么是变量12-21

C语言变量的命名规则10-27

C语言程序的存储区域12-14