免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sky_terry
打印 上一主题 下一主题

今天笔试的一题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2005-10-28 17:46 |只看该作者

今天笔试的一题

这个题可能是考应试者的反应

如果你回答越界,态度是否犹豫不决

论坛徽章:
0
32 [报告]
发表于 2005-10-28 18:00 |只看该作者

今天笔试的一题

这个题可能是考应试者的反应


这个。。。。

论坛徽章:
0
33 [报告]
发表于 2005-10-28 19:58 |只看该作者

今天笔试的一题

原帖由 "mik" 发表:

兄弟,你要结合上下文来看呀!!!!! 你先看一看前面几个贴的回复

我的汇编代码是,取得a[4]
呵呵,原来是一场误会!
不好意思, 让兄弟受惊了. 我表示歉意!

论坛徽章:
0
34 [报告]
发表于 2005-10-29 20:41 |只看该作者

今天笔试的一题

原帖由 "libin1983" 发表:


至于楼主说的1,我猜跟 " int main()"有关:
    正常情况下,程序结束 "return 0"执行,返回..........

这个猜测是错的。

论坛徽章:
0
35 [报告]
发表于 2005-10-31 15:17 |只看该作者
原帖由 ithinc 于 2005-10-26 23:02 发表
#include <stdio.h>;

int main()
{
int a[20]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19},*p;
p=a;
printf("%dn",*(p+4*sizeof(int)));
return 0;
}

楼主把 ...



在linux 下用GCC 编译后,得得结果为16 ,sizeof( int ) = 4;
在windows下用TC2.0编译执行后为8,sizeof( int ) = 2;
那个题目也就是要考一下指针的偏移方式,我觉得!

论坛徽章:
0
36 [报告]
发表于 2005-10-31 16:07 |只看该作者
To 楼上的:
更糊涂了......

论坛徽章:
0
37 [报告]
发表于 2005-10-31 16:32 |只看该作者
非也,C的指针和整行作算术运算的时候,是每+1就移动sizeof(*p)内存地址
把int 数组换成一个struct数组就明显了
另外楼上有人说因为数组越界导致程序出错返回错误代码也是不对的,C语言没有越界保护滴啊
int *p;
p+4就应该是p移动了64个字节;
p+4*sizeof(int)就应该是移动了64*4个字节了,至于256个字节之后内存到底是啥谁也不能确定啊可能是栈里的?

晕.写的时候脑子胀了,补充下
p+4就应该是p移动了16字节
p+4*sizeof(int)就应该是移动了16*4个字节了,至于64个字节之后内存到底是啥谁也不能确定啊可能是栈里的?


  1. #include <stdio.h>;

  2. int main()
  3. {
  4.   int a[5]={0,1,2,3,4},*p;
  5.   p=a;
  6.   printf("%d\n",p);
  7.   printf("%d\n",(p+4*sizeof(int)));
  8.   printf("%d\n",(p+4*sizeof(int)) - p);
  9.   return 0;
  10. }

复制代码


前两行差64,最后一行却是16,说明p和p+4*sizeof(int)对于指针来说只差了16而已,也就是说p+16就是&a[16]

[ 本帖最后由 艾斯尼勒 于 2005-10-31 17:00 编辑 ]

论坛徽章:
0
38 [报告]
发表于 2005-10-31 17:13 |只看该作者
原帖由 xiaohuli 于 2005-10-31 15:17 发表



在linux 下用GCC 编译后,得得结果为16 ,sizeof( int ) = 4;
在windows下用TC2.0编译执行后为8,sizeof( int ) = 2;
那个题目也就是要考一下指针的偏移方式,我觉得!


这里需要知道的一点是tc是在windows环境下模拟一个16位机器的环境!所以int是2个

在gcc和vc下的int都是4个字节

ps:快点放弃tc2.0吧!

论坛徽章:
0
39 [报告]
发表于 2005-11-03 09:48 |只看该作者
引用:
tc是在windows环境下模拟一个16位机器的环境!所以int是2个
在gcc和vc下的int都是4个字节

恩 很对
受教啊!!!
我修改了一下源代码

#include <stdio.h>

int main()
{
int a[5]={0,1,2,3,4},*p;
char *pointer;
p=a;
pointer = (char*) p;
printf("%d\n",*(pointer+4*sizeof(int)));
return 0;
}

输出结果是:4
这样就可以避免越界的问题了
PostScript:sizeof(char)=1 sizeof(int)=4
sizeof(char)*4*sizeof(int)/sizeof(int) =相当于数组的下标  

不知道我的理解对不对
--------------------------
抓紧时间看汇编
updating 该用户已被删除
40 [报告]
发表于 2005-11-11 23:24 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP