Chinaunix

标题: 静态局部变量是在什么时候分配的内存? [打印本页]

作者: teclimber    时间: 2011-11-07 10:51
标题: 静态局部变量是在什么时候分配的内存?
用static定义的静态局部变量是在什么时候分配的内存?在什么时候做的初始化?
作者: samzc2010    时间: 2011-11-07 10:58
静态变量的初始化和内存分配是在进程启动初始化的时候就完成了。
作者: linux_arm    时间: 2011-11-07 22:06
这要看你代码是怎么写的了吧,如果类似static var = 1;这样的方式,那数据会在data段,如果是static var;这样的定义方式,那数据会在bss段;
前者在生产可执行文件时就分配好内存了,后者在加载时才分配;
当然由于编译器的实现不同,可能与实际情况略有差异,不过有一点,关键是看static变量放在data段还是bss段,在深刻点,要看static在可执行文件的段属性来确定。
不知道解答是否和你的提问一致
作者: teclimber    时间: 2011-11-08 09:24
回复 3# linux_arm


    也就是说在程序运行的时候不会再去为这条语句分配内存了?是吗?
作者: linux_arm    时间: 2011-12-05 17:47
回复 4# teclimber
是的,数据段的内容是在编译期间就决定了的,程序加载后数据就在那里了,不会再分配内从了

malloc之类或局部变量,才会在运行期动态分配内存。
作者: lxyscls    时间: 2011-12-06 10:03
编译时决定,数据段

建议看看《C专家编程》第6章{:3_189:}
作者: Mr_Yao    时间: 2011-12-06 16:17
一般說來,C語言的存儲空間佈局是這樣的:
______________
|                          |   高地址
|                          |   命令行參數+環境變量
|_____________|   
|          棧             |
|_ _ _ _ _ _ _ _ _|
|          堆             |
|                          |
|_____________|
|  未初始化的數據   |   由exec初始化為0
|_____________|
|    初始化的數據    |  由exec從文件中讀入
|_____________|
|                          |  
|       正 文            |  由exec從文件中讀入
|_____________|  低地址
作者: zxb167    时间: 2013-04-24 13:00
本帖最后由 zxb167 于 2013-04-24 13:11 编辑

争对你的问题做了一个实现,调试在一进入main函数的时候,就watch各个变量的地址,最终得到如下的效果(我用的是vs2010开发平台,其它的平台没有测试过):
  1. #include <iostream>

  2. using namespace std;

  3. /*定义全局静态变量*/
  4. static int a;
  5. static int b=1;
  6. /*定义全局变量*/
  7. int e;
  8. int f = 1;

  9. void fun()
  10. {
  11.         /*定义局部静态变量*/
  12.         static int c;
  13.         cout << "c: " << &c << endl;
  14. }
  15. void fun1()
  16. {
  17.         /*定义局部静态变量*/
  18.         static int d = 2;
  19.         cout << "d: " << &d << endl;
  20. }
  21. void main()
  22. {
  23.         cout << "a: " << &a << endl;
  24.         cout << "b: " << &b << endl;
  25.        
  26.         fun();
  27.         fun1();
  28. }
复制代码
从图中可以看出,无论是初始化了的局部静态变量,还是未初始化的局部静态变量,在程序第一次调用方法的时候才会在data区分配内存空间


1.jpg (29.26 KB, 下载次数: 13)

1.jpg

作者: lin5161678    时间: 2013-04-24 13:44
回复 8# zxb167

错误的理解

你没看懂图的具体意思

图中 c d 看不到是因为 在当前作用域里面
没有c d 这两个标示符

这个是变量的作用域决定的
在main 函数里面 看不到 c d
所以 调试器给出 找不到标示符的提示
   
作者: idi0t    时间: 2013-04-24 14:43
"静态的“应该是需要一直存在的。而且很同意楼上说的。
作者: onlyforcloud    时间: 2013-04-26 16:43
举个例子。linux下。 readelf -a 程序名 就可以看出来到底在bss 还是 data段。 data段会增加程序的大小,bss不会
作者: zxb167    时间: 2013-05-14 15:19
回复 9# lin5161678

本人理解有误,谢谢正解!局部静态变量,是在编译的时候分配内存空间,还是在运行到的时候分配内存空间啊?   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2