| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1307 人关注过本帖
标题:谁来解释下这段代码。
只看楼主 加入收藏
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
结帖率:100%
收藏
 问题点数:0 回复次数:10 
谁来解释下这段代码。
程序代码:
#include <iostream>
using namespace std;
void a()
{
    volatile int array[10];
    for (int i = 0; i < 10; i++)
        array[i] = i;   
}

void b()
{
    int array[10];
    for (int i = 0; i < 10; i++)
        cout << array[i];
}

int main()
{
    a();
    b();
}
搜索更多相关主题的帖子: 解释 
2011-11-10 16:30
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
哪来的这种代码?这种旁门左道的东西,没什么意思。
函数a和b的变量形式是完全一样的,所以它们在栈内的相对顺序也是一样的。
由于C/C++对局部变量是不进行初始化的,所以b中array的偏移量刚好与原来a中array的位置一样,借此读出array中的残像。
调换一下其中一个函数中i和array的声明顺序,结果就会错位了,可以试试。


重剑无锋,大巧不工
2011-11-10 16:52
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用beyondyf在2011-11-10 16:52:20的发言:

哪来的这种代码?这种旁门左道的东西,没什么意思。
函数a和b的变量形式是完全一样的,所以它们在栈内的相对顺序也是一样的。
由于C/C++对局部变量是不进行初始化的,所以b中array的偏移量刚好与原来a中array的位置一样,借此读出array中的残像。
调换一下其中一个函数中i和array的声明顺序,结果就会错位了,可以试试。



C/C++程序员应该对mem更为敏感。你的sense还不够。

你应该注意到volatile 这个keyword.
2011-11-10 16:55
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
无非就是不要让编译器把那个循环优化掉了而已

专心编程………
飞燕算法初级群:3996098
我的Blog
2011-11-10 17:02
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
volatile这个关键字不是重点。防止编译器优化而已。就这段代码,有它没它都一样。
重点还是理解函数调用过程中对栈的使用。
还有,以后说话不要这么刻薄。是你在问别人,不是别人在问你。sense不够的是你。

重剑无锋,大巧不工
2011-11-10 17:03
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用beyondyf在2011-11-10 17:03:38的发言:

volatile这个关键字不是重点。防止编译器优化而已。就这段代码,有它没它都一样。
重点还是理解函数调用过程中对栈的使用。
还有,以后说话不要这么刻薄。是你在问别人,不是别人在问你。sense不够的是你。


我显然不是在问,是再反问。
2011-11-10 17:07
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用StarWing83在2011-11-10 17:02:09的发言:

无非就是不要让编译器把那个循环优化掉了而已


StarWing83 好久不见。

本来我也这么想的。

我check了下,发现不是这样的。
2011-11-10 17:08
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:0 
回复 5楼 beyondyf
同意。
volatile在此是无关紧要的。造成这种现象更重要的是函数调用过程中,对堆栈的操作。
2011-11-10 17:14
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
提示: 该帖被管理员或版主屏蔽

我就是真命天子,顺我者生,逆我者死!
2011-11-10 21:28
DefineFeel
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:57
专家分:136
注 册:2011-10-18
收藏
得分:0 
回复 2楼 beyondyf
为什么说是旁门左道呢,这明显是c++了,那个关键字还是有用的,面试的时候这种题目多
2011-11-10 22:21
快速回复:谁来解释下这段代码。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018124 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved