免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 14047 | 回复: 11

[C] 静态局部变量是在什么时候分配的内存? [复制链接]

论坛徽章:
0
发表于 2011-11-07 10:51 |显示全部楼层
用static定义的静态局部变量是在什么时候分配的内存?在什么时候做的初始化?

论坛徽章:
0
发表于 2011-11-07 10:58 |显示全部楼层
静态变量的初始化和内存分配是在进程启动初始化的时候就完成了。

论坛徽章:
0
发表于 2011-11-07 22:06 |显示全部楼层
这要看你代码是怎么写的了吧,如果类似static var = 1;这样的方式,那数据会在data段,如果是static var;这样的定义方式,那数据会在bss段;
前者在生产可执行文件时就分配好内存了,后者在加载时才分配;
当然由于编译器的实现不同,可能与实际情况略有差异,不过有一点,关键是看static变量放在data段还是bss段,在深刻点,要看static在可执行文件的段属性来确定。
不知道解答是否和你的提问一致

论坛徽章:
0
发表于 2011-11-08 09:24 |显示全部楼层
回复 3# linux_arm


    也就是说在程序运行的时候不会再去为这条语句分配内存了?是吗?

论坛徽章:
0
发表于 2011-12-05 17:47 |显示全部楼层
回复 4# teclimber
是的,数据段的内容是在编译期间就决定了的,程序加载后数据就在那里了,不会再分配内从了

malloc之类或局部变量,才会在运行期动态分配内存。

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2011-12-06 10:03 |显示全部楼层
编译时决定,数据段

建议看看《C专家编程》第6章{:3_189:}

论坛徽章:
0
发表于 2011-12-06 16:17 |显示全部楼层
一般說來,C語言的存儲空間佈局是這樣的:
______________
|                          |   高地址
|                          |   命令行參數+環境變量
|_____________|   
|          棧             |
|_ _ _ _ _ _ _ _ _|
|          堆             |
|                          |
|_____________|
|  未初始化的數據   |   由exec初始化為0
|_____________|
|    初始化的數據    |  由exec從文件中讀入
|_____________|
|                          |  
|       正 文            |  由exec從文件中讀入
|_____________|  低地址

论坛徽章:
0
发表于 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

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
发表于 2013-04-24 13:44 |显示全部楼层
回复 8# zxb167

错误的理解

你没看懂图的具体意思

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

这个是变量的作用域决定的
在main 函数里面 看不到 c d
所以 调试器给出 找不到标示符的提示
   

论坛徽章:
36
CU大牛徽章
日期:2013-09-18 15:24:20NBA常规赛纪念章
日期:2015-05-04 22:32:03牛市纪念徽章
日期:2015-07-24 12:48:5515-16赛季CBA联赛之辽宁
日期:2016-03-30 09:26:4715-16赛季CBA联赛之北控
日期:2016-03-30 11:26:2315-16赛季CBA联赛之广夏
日期:2016-05-20 15:46:5715-16赛季CBA联赛之吉林
日期:2016-05-24 11:38:0615-16赛季CBA联赛之青岛
日期:2016-05-30 13:41:3215-16赛季CBA联赛之同曦
日期:2016-06-23 16:41:052015年亚洲杯之巴林
日期:2015-02-03 15:05:04CU大牛徽章
日期:2013-09-18 15:24:52CU十二周年纪念徽章
日期:2013-10-24 15:46:53
发表于 2013-04-24 14:43 |显示全部楼层
"静态的“应该是需要一直存在的。而且很同意楼上说的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP