LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: zywwzy

我今天为招聘新员工出的C语言考题

[复制链接]
发表于 2003-6-18 01:35:06 | 显示全部楼层
是啊,libinary 兄的有理有据,也很全面,不服不行啊。

PowerPC 的堆栈是生长方向是跟 IA32 相反的,加上字节顺序也相反。这个程序到了 PPC 上就会变成输出 24,0,48 了。

而且,我认为编译的时候最好加上 -Wall 打开所有警告,这样的话好像 sscanf(str_val2,"%d",&var2); 这样的地方就会有警告出来:
warning: int format, different type arg (arg 3)
发表于 2003-6-18 03:39:03 | 显示全部楼层

看不懂

别搞这么专业!俺是外行!哈哈

还是上酸莱吧!!!!
发表于 2003-6-18 10:51:46 | 显示全部楼层
早知道我去你门公司应聘了~~~~
发表于 2003-6-18 12:11:38 | 显示全部楼层
呵呵,论坛里真正难得有这么专业的讨论。
发表于 2003-6-18 13:07:02 | 显示全部楼层
长见识。
发表于 2003-6-18 15:07:27 | 显示全部楼层
不好意思,误发了相同的贴子。
发表于 2003-6-18 15:08:32 | 显示全部楼层
最初由 0100 发表
我还是有个地方不明白。
[/code]
int main(void)
{
int var1=0;
char var2=0;
int var3=0;
char str_val1[]="24\n";
char str_val2[]="32\n";//这里定义的32不是字符吗?为什么转换成整形数时,没有转换成99,98?
char str_val3[]="48\n";
sscanf(str_val1,"%d",&var1);
sscanf(str_val2,"%d",&var2);
sscanf(str_val3,"%d",&var3);//为什么这里不覆盖掉var2?
printf("var1=%d,var2=%d,var3=%d\n",var1,var2,var3);
}
[/code]
发表于 2003-6-18 16:37:42 | 显示全部楼层
1.你可以看看sscanf函数的说明。它是从字符串读入数据。
2.要从汇编的角度来理解问题。你自己在纸上模拟一下堆栈的存贮情况就好理解了。要知道,C语言有时被称为高级汇编语言。
 楼主| 发表于 2003-6-18 19:16:15 | 显示全部楼层
最初由 0100 发表


这里首先有一个前提,编译器没有使用机器字对齐优化选项,基于x86 cpu的操作系统(linux,windows随便)
C语言中局部变量在内存中的存放是连续的。
排列如下:
var3:__【字节1】   
_______【字节2】
_______【字节4】
var2:__【字节1】
var1:__【字节1】   
_______【字节2】
_______【字节3】
_______【字节4】
本题主要涉及C语言里的指针问题。
执行完var1的赋值语句之后
var3:__【字节1】   
_______【字节2】
_______【字节3】
_______【字节4】
var2:__【字节1】
var1:__【字节1】=24   
_______【字节2】=0
_______【字节3】=0
_______【字节4】=0
由于传递给sscanf的&var2是个整形指针,所以对var2赋值将连续写4个字节的内存地址,执行完var2的赋值语句之后
var3:__【字节1】   
_______【字节2】
_______【字节3】
_______【字节4】
var2:__【字节1】=======32
var1:__【字节1】=24===0
_______【字节2】=0====0
_______【字节3】=0====0
_______【字节4】=0
明白了吗?
这是一个在编写C语言程序时经常会不知不觉犯下的错误代码,有时会错得不知所措。我把他称为“隐形的缓冲区溢出”。^_^
发表于 2003-6-19 07:11:48 | 显示全部楼层
说明得不错。我昨天就在想用什么方法来表达这个问题,还是楼上的想得周到。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表