|
发表于 2004-11-27 12:55:45
|
显示全部楼层
这个问题都讨论了一年半了,哈哈!
这个问题还有一个漏洞,就是编译器如何在栈中分配内存的。
要得到预想的答案,那么编译器在栈中分配内存时必须按照
定义变量的顺序从高地址到低地址依次分配,但是这并不是
标准啊!
我用vc和cygwin分别做了一个实验,考察var*的地址
第一次用楼主的代码,- int main(void)
- {
- int var1=0;
- char var2=0;
- int var3=0;
- char str_val1[]="24\n";
- char str_val2[]="32\n";
- char str_val3[]="48\n";
- sscanf(str_val1,"%d",&var1);
- sscanf(str_val2,"%d",&var2);
- sscanf(str_val3,"%d",&var3);
- printf("var1=%d,var2=%d,var3=%d\n",var1,var2,var3);
- }
复制代码 gcc输出- var1 2289588
- var2 2289587
- var3 2289580
复制代码
vc输出- var1 1245044
- var2 1245043
- var3 1245036
复制代码 这样看题目没问题,但是在增加一个变量var4试试- int main()
- {
- int var1=0;
- char var2=0;
- int var3=0;
- char var4=0;
- printf("var1 %d\nvar2 %d\nvar3 %d\nvar4 %d\n",&var1,&var2,&var3,&var4);
- }
复制代码 gcc- var1 2289588
- var2 2289587
- var3 2289580
- var4 2289579
复制代码 可见gcc时按定义顺序依次分配空间
vc- var1 1245044
- var2 1245043
- var3 1245036
- var4 1245051
复制代码 看看var4的地址,显然vc并非按顺序分配。
以上gcc和vc都没有打开任何优化选项 |
|