免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3640 | 回复: 7
打印 上一主题 下一主题

变量空间是在编译是分配的还是在运行时分配的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-11 19:51 |只看该作者 |倒序浏览
#define size 1024

void fun(void)
{
        char b[size]={0};
        char bb[size]={0};
        char bbb[size]={0};
        char a[size]={0};
        char aa[size]={0};
        char aaa[size]={0};
}

int main(void)
{
        int a;
        a=0;
        fun();
        return 0;
}


比如这段代码,是在fun()里的空间是在编译时已经分配好的,还是在运行到fun()时再分配的。

论坛徽章:
0
2 [报告]
发表于 2007-10-11 20:12 |只看该作者
都是auto变量嘛,当然是在运行时分配了

论坛徽章:
0
3 [报告]
发表于 2007-10-11 20:13 |只看该作者
调用时分配在栈上

论坛徽章:
0
4 [报告]
发表于 2007-10-11 20:24 |只看该作者
按LZ口吻,是编译时,编译器在栈上分配的

论坛徽章:
0
5 [报告]
发表于 2007-10-11 21:46 |只看该作者
原帖由 xieShell 于 2007-10-11 19:51 发表


比如这段代码,是在fun()里的空间是在编译时已经分配好的,还是在运行到fun()时再分配的。

函数的栈空间大小在编译时确定。
在运行时,程序第一次访问栈时,会产生一个page fault,由内核分配实际的内存

论坛徽章:
0
6 [报告]
发表于 2007-10-12 01:23 |只看该作者
局部的变量,可以认为是编译时计算好的,但是运行时才用,实际上你可以用vc的debug功能看一眼就明白了,就是个
esp - n(从此之后,这个N按理说是你需要的变量空间,但是也不一定,依赖与编译器实现,反正就是从栈上留一块地,等引用那个变量的时候就用ebp + xxx)



void test()
{
00401000  push        ebp  
00401001  mov         ebp,esp
00401003  sub         esp,0Ch      //这里是分配栈空间,所谓的编译时计算就是这个是确定的
                int x = 8;
00401006  mov         dword ptr [x],8  //这里其实是根据那个ebp地址 + 多少(依赖于你的前面那个变量大小,这个x可能地址就是ebp + 0,不过这些都根据编译器有关,所以不是那么确定的),但是汇编器可能能直接根据符号得倒地址,所以这里直接显示 x变量名了。
                int y = 9;
0040100D  mov         dword ptr [y],9
                int z = 10;
00401014  mov         dword ptr [z],0Ah

}
0040101B  mov         esp,ebp
0040101D  pop         ebp  
0040101E  ret

[ 本帖最后由 Solidus 于 2007-10-12 01:27 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-10-12 08:54 |只看该作者
一般的,局部变量是在运行时分配的,之所以这么说比较确切,是因为局部变量,如被调用函数中使用的变量,他们在每次调用时的地址很可能是不相同的。

而全局变量是在编译时就决定了的,你必须告诉编译器变量的地址。

论坛徽章:
0
8 [报告]
发表于 2007-10-13 14:24 |只看该作者
知道了,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP