发一道曙光面试题

sunlp007 2011-12-10 11:39:40


#include <stdio.h>

void main()
{
int a = 0x12345678;
int b = 0x567890AB;
int c = 0x7890ABCD;

char * p = (char*)&a;
char * q = p + 2;
int x = *(int*)q;

printf("x=%X",x);
}
...全文
2062 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
donghw1030 2011-12-14
  • 打赏
  • 举报
回复
1234 前面具体是什么值不好说 跟其他地方的代码有关
竞天问 2011-12-14
  • 打赏
  • 举报
回复
大小端和内存分布吧
孤独小剑 2011-12-14
  • 打赏
  • 举报
回复
写那么多的童鞋们,怎么没人提大小断的问题呢?
yujie_v 2011-12-14
  • 打赏
  • 举报
回复
内存中的存储格式
eraser2011 2011-12-13
  • 打赏
  • 举报
回复
90AB1234
linshenqi 2011-12-13
  • 打赏
  • 举报
回复
这个要考虑大小端的
楚天乐 2011-12-13
  • 打赏
  • 举报
回复
这个问题到这里 楼主该既结贴了
楚天乐 2011-12-13
  • 打赏
  • 举报
回复
47楼

看来你不了解push和pop操作啊
push是入栈 esp-=4
爷就是说栈顶是低地址

[Quote=引用 47 楼 sky_wym 的回复:]

11楼对于a,b地址的解释好像不大对。
a,b为局部变量,存在于栈中。应该是b先入栈,而后是a。那么就是a的地址高于b,不管是大端还是小端模式,都不会涉及到b的内容。
最后高4位的输出是不可预测的。
而低4位,根据大小端而定。
[/Quote]
楚天乐 2011-12-13
  • 打赏
  • 举报
回复
回复47楼:
并不是所有编译器都这么干的。
你可以看下vs2010 debug版本和release版本的这个程序的内存分布。
debug版本是c,b,a从地地址到高地址,爷就是说,是a先入栈,c最后入栈的。
release版本里面我没发现有b和c估计是被优化掉了。

测试环境 : win7 64bit + vs2010旗舰版

[Quote=引用 47 楼 sky_wym 的回复:]

11楼对于a,b地址的解释好像不大对。
a,b为局部变量,存在于栈中。应该是b先入栈,而后是a。那么就是a的地址高于b,不管是大端还是小端模式,都不会涉及到b的内容。
最后高4位的输出是不可预测的。
而低4位,根据大小端而定。
[/Quote]
ghost5216 2011-12-13
  • 打赏
  • 举报
回复
本论坛的一位大牛曾经告诉过我
局部变量的顺序是未定的。
int a = 0x12345678;
int b = 0x567890AB;
int c = 0x7890ABCD;
也就是说 &a = &b +4
&b = &c +4
是不成立的。
具体和编译器有关。
wxwlll 2011-12-13
  • 打赏
  • 举报
回复
看来各家公司都喜欢考指针!
楚天乐 2011-12-12
  • 打赏
  • 举报
回复
你去release版本看下结果
这个值应该是随机的
CC 是 int 3号中断

这个是因为编译器在debug版本里使用cc初始化堆栈的



[Quote=引用 24 楼 goldbeef 的回复:]

引用 2 楼 terenceliqiang 的回复:

应该是CCCC1234吧。。。
a的空间里面是 78 56 34 12
然后q指向了34.。。。。
b c两个变量不知道干嘛的。。。他们是应该在a的上面 也就是低地址。。。
正解
[/Quote]
volcan1987 2011-12-12
  • 打赏
  • 举报
回复
好复杂。。。
鲲尘千古 2011-12-12
  • 打赏
  • 举报
回复
这个每运行一次结果就不同的。
天云 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 modicum_ck 的回复:]

楼上各位是不是把这个题想复制了?
其实这个结果是不确定的,主要还是看编译器在a的地址后面填充的是什么东西。

这样看看:
C/C++ code

#include <stdio.h>

void main()
{
int b = 0x567890AB; //调换下位置
int a = 0x12345678;
int c = 0x7890ABCD;
……
[/Quote]

顶下,感觉公司应该是考的内存中的内容存放规则,但是有可能是大端和小端,所以结果是不确定的,windows下一般是小端。
fsq2006 2011-12-12
  • 打赏
  • 举报
回复
应该是????1234,????表示不确定,应该是cccc,但也有可能是其他
chmlqw 2011-12-12
  • 打赏
  • 举报
回复
其实大家都搞错了 是LZ把题目记错
最开始 p = &b
哇哈哈
yhj_no1 2011-12-12
  • 打赏
  • 举报
回复
FFC01234,运行过的
zhaoning_xueye 2011-12-12
  • 打赏
  • 举报
回复
正确答案应为90AB1234不过的工具可能产生的几个不一样~
bbyf920 2011-12-12
  • 打赏
  • 举报
回复
linux 下是11234 结果确定。。。
加载更多回复(37)

69,385

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧