题目地址:http://bbs.csdn.net/topics/390415100
原题:
int main(){
char str1[]="123";
char str2[]="123456789";
int m=0x1234;
int n =0x5678;
strcpy(str1,str2);printf("str1:%s\n",str1);
return 0;
}
问:输出是神马?
我的答案:123456789,但是str1会有访问越界。
好了,面试官不屑对我说,是这样么,你好好想想大小端,堆栈吧,我又说了下大小端字节序:大头--低地址存高位;小头:低地址存低位。
面试官让我回来好好研究这道题的答案是神马,反正是答错了。然后跟我说西,西加加基础太差了,不符合要求。
求教大家了
====================
析:在debug下查看汇编代码易知,栈空间是从地址高处往地址低处来分配的,bp寄存器在最下面,即地址最高处。vc++ 6.0的编译器默认根据源代码中变量定义的顺序依次从地址高处往地址低处分配变量空间,即栈空间如下所示:
n | 低地址
m |
str2 |
str1 |
bp | 高地址
从栈空间易知,str1从上到下依次为:
1
2
3
'\0'
str2从上到下依次为:
1
2
3
4
5
6
7
8
9
'\0'
m从上到下为(intel为小端模式):
34 (一个字节)
12
00
00
n从上到下为:
78
56
00
00
从strcpy源码易知,其以第二个操作数中的结束符('\0')作为复制结束标记。因此,str2复制到str1时,会破坏掉下面的bp寄存器及其它寄存器,即栈被冲破,其中的上下文丢失了,导致程序无法正常返回。