| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 431 人关注过本帖
标题:请教一个问题,希望高手赐教
只看楼主 加入收藏
yuanfeng1129
Rank: 2
等 级:论坛游民
帖 子:62
专家分:31
注 册:2010-8-7
结帖率:0
收藏
已结贴  问题点数:20 回复次数:7 
请教一个问题,希望高手赐教
40.有以下程序:
  void swap1(int c0[],int c1[])
  {
     Int t;
     T=c0[0];c0[0]=c1[0];c1[0]=t;
  }
   Void swap2(int *c0,int *c1)
   {
      Int t;
      T=*c0;*c0=*c1;*c1=t;
   }
   Void main()
   {
      Int a[2]={3,5},b[2]={3,5};
      Swap1(a,a-1);swap2(&b[0],&b[1]);
      Printf(“%d %d %d %d\n”,a[0],a[1],b[0],b[1]);
   }
   程序运行后的输出结果是( A  )。
   A.5 5 3 3              B.5 3 3 5
   C.3 5 3 5              D.5 3 5 3
2010-08-09 16:37
yuanfeng1129
Rank: 2
等 级:论坛游民
帖 子:62
专家分:31
注 册:2010-8-7
收藏
得分:0 
40.与变量存储顺序有关。

在此题中,函数swap1与swap2是完全等价的,作用上没有任何区别。

从编译原理看,编译器有一个变量定义栈。编译器每遇到一个新定义的变量就将其压入栈。等所有变量全部定义完毕,再从栈逐个弹出。

根据栈的特点,编译时,最后遇到的变量最先弹出,于是最早存放在内存中。

在本题中,先定义a数组,再定义b数组,所以内存中先存放b数组,再存放a数组。

所以两个数组在内存中的存放顺序是b[0] b[1] a[0] a[1]。其值依次为3 5 3 5。

在swap1(a,a-1);语句中,a-1是一个溢出的地址,按理说是不该出现的。但根据变量存放顺序,它实际上指向的是b[1]。

所以执行swap1时,实际是将中间的两个变量的值互换,也就是互换b[1]和a[0]的值,四个变量依次为3 3 5 5。

执行swap2时,将b[0]和b[1]的值互换,四个变量依次为3 3 5 5。

输出时,对应a[0]、a[1]、b[0]、b[1]依次为5、5、3、3。
以上是高手的解答,我有点不懂,就是这个栈的问题,是不是变量定义后都要先进栈再出栈的啊
2010-08-09 16:38
yuanfeng1129
Rank: 2
等 级:论坛游民
帖 子:62
专家分:31
注 册:2010-8-7
收藏
得分:0 
http://bbs.lehu.shu.
我在这里也问过了的
2010-08-09 16:39
yuanfeng1129
Rank: 2
等 级:论坛游民
帖 子:62
专家分:31
注 册:2010-8-7
收藏
得分:0 
高手有独到见解麻烦说一下,小弟不胜感激
2010-08-09 16:39
ggyy4k
Rank: 5Rank: 5
等 级:职业侠客
帖 子:111
专家分:334
注 册:2010-6-28
收藏
得分:6 
二楼解答的很正确,补充一点,不同的编译器在定义变量时入栈的顺序是不一样的,以int a[2],b[2]为例,在TC中,顺序为a[0],a[1],b[0],b[1];在vc中顺序为b[0],b[1],a[0],a[1],楼主可以做个简单的实验
在程序后面加上:
printf("0x%x\n", &b[0]);
printf("0x%x\n", &b[1]);
printf("0x%x\n", &a[0]);
printf("0x%x\n", &a[1]);
在tc与vc中各做一次实验
在下面的帖子中也有详尽的解释
https://bbs.bccn.net/viewthread.php?tid=314069&page=1#pid1812237

[ 本帖最后由 ggyy4k 于 2010-8-9 18:58 编辑 ]
2010-08-09 18:56
yuanfeng1129
Rank: 2
等 级:论坛游民
帖 子:62
专家分:31
注 册:2010-8-7
收藏
得分:0 
我只想知道  为什么先入栈的在内存地址的高端
2010-08-09 19:30
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1706
专家分:4350
注 册:2007-12-27
收藏
得分:6 
以下是引用yuanfeng1129在2010-8-9 19:30:06的发言:

我只想知道  为什么先入栈的在内存地址的高端
这个没有为什么,你就知道系统就是那么干的就可以了。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2010-08-09 19:36
zxq198206
Rank: 1
等 级:新手上路
帖 子:1
专家分:7
注 册:2010-3-2
收藏
得分:6 
其实这个题目的关键问题,不像2楼解释的那么复杂。给我们最大困惑的只有一个,
就是 a-1溢出时,指向了b[1],明白了这点就一同全通了。
这样 swap1时,a[0],b[1]交换,a[0]=5,b[1]=3;
swap2时,b[0],b[1]交换,得到 b[0]=3,b[1]=3;
所以最后的结果是 a[0]=5,a[1]没有变化还是3,b[0]=3,b[1]=3;
2010-08-09 23:23
快速回复:请教一个问题,希望高手赐教
数据加载中...
 
   



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

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