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开发平台,其它的平台没有测试过):
#include <iostream>
using namespace std;
/*定义全局静态变量*/
static int a;
static int b=1;
/*定义全局变量*/
int e;
int f = 1;
void fun()
{
/*定义局部静态变量*/
static int c;
cout << "c: " << &c << endl;
}
void fun1()
{
/*定义局部静态变量*/
static int d = 2;
cout << "d: " << &d << endl;
}
void main()
{
cout << "a: " << &a << endl;
cout << "b: " << &b << endl;
fun();
fun1();
}
复制代码
从图中可以看出,无论是初始化了的局部静态变量,还是未初始化的局部静态变量,在程序第一次调用方法的时候才会在data区分配内存空间
1.jpg
(29.26 KB, 下载次数: 13)
下载附件
2013-04-24 13:01 上传
作者:
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