迅雷笔试两个小问题
1.char b[ ] = {‘x’, ‘y’, ‘z’};
为什么strlen(b) = 7;
2.如下C++程序
int i = 0x22222222;
char szTest[ ] = “aaaa”; //a的ascii码为0x61
func(i, szTest); //函数原型为void func(int a, char *sz);
请问刚进入func函数时,参数在栈中的形式可能为:(左侧为地址,右侧为数据)
A) 0x0013FCF0 0x61616161 B) 0x0013FCF0 0x22222222
0x0013FCF4 0x222222220x0013FCF4 0x0013FCF8
0x0013FCF8 0x000000000x0013FCF8 0x6161616161
C) 0x0013FCF0 0x22222222 D) 0x0013FCF0 0x0013FCF8
0x0013FCF4 0x616161610x0013FCF4 0x22222222
0x0013FCF8 0x000000000x0013FCF8 0x6161616161
这个题目的答案是那个,请解析或给出相关网页的链接。谢谢
[解决办法]
第一个答案应该是随机的,strlen在计算的时候直到遇到'\0'为止。
第二个看部太懂,按说应该是szTest首地址入栈,再是i入栈的,栈由高地址向低地址增长的,不清楚
[解决办法]
第二题选B。
考查的是函数调用时的参数传递和栈帧结构。可以看深入理解计算机(computer system: from a programmer's perspective)一书的3.7节,或在网上搜"栈帧结构"之类的
[解决办法]
第一题跟具体情况有关
比如如果:
int main( )
{
char b[]={'x','y','z'};
cout<<strlen(b)<<endl;
return 0;
}
输出有可能是7,但如果
int main( )
{
int a = 0;
char b[]={'x','y','z'};
cout<<strlen(b)<<endl;
return 0;
}
输出肯定是 4
第二题,有点迷惑
调用函数时首先进行参数压栈,一般情况下压栈顺序为从右到左
先压 sz 再压 i 最后压函数地址,但是压sz的时候好像不是直接压的0x61616161而是压的是szTest的地址
如果依题意压sz压得是0x61616161我觉得如果压栈约束为_cdel的话答案应该是C
A:默认情况下函数压栈约束一般是 _cdel ,如果当前函数压栈约束不是_cdel A有可能对
B:感觉压栈顺序有点问题
D:压栈顺序正确,但0x0013FCF0 应该压的是函数地址啊不知道为什么是 0x0013FCF8
因为0x0013FCF8依题意不可能是函数地址
以上是个人见解,等待高手
[解决办法]
第二题根据情况而定
VC都是有设定的
用_cdel选D
用标准的PASCAL调用选B
0x0013FCF8就是指针szTest,
即指针szTest=0x0013FCF8
指针中的内容为:0x6161616161
[解决办法]
恩,对于第一题,strlen()是遇到\0才停止计算的,
所以答案是不确定的,对于给出的7完全是迷惑人的。
真的很阴险啊!!
以下是我做实验的结果
- C/C++ code
// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"using namespace std;int _tmain(int argc, _TCHAR* argv[]){ char b[] = {'a','b','c'}; cout << strlen(b);//output 11 cin.get(); return(0);}
[解决办法]
第二题确实是根据情况而定,不过除了压栈顺序,还要考虑栈的生长方向.
事实上,在Windows平台上,栈都是向下生长的.所以默认的_cdel应选B,标准PASCAL调用选D.
[解决办法]
第一题跟具体情况有关
比如如果:
int main( )
{
char b[]={ 'x ', 'y ', 'z '};
cout < <strlen(b) < <endl;
return 0;
}
输出有可能是7,但如果
int main( )
{
int a = 0;
char b[]={ 'x ', 'y ', 'z '};
cout < <strlen(b) < <endl;
return 0;
}
输出肯定是 4
第二题,有点迷惑
调用函数时首先进行参数压栈,一般情况下压栈顺序为从右到左
先压 sz 再压 i 最后压函数地址,但是压sz的时候好像不是直接压的0x61616161而是压的是szTest的地址
如果依题意压sz压得是0x61616161我觉得如果压栈约束为_cdel的话答案应该是C
A:默认情况下函数压栈约束一般是 _cdel ,如果当前函数压栈约束不是_cdel A有可能对
B:感觉压栈顺序有点问题
D:压栈顺序正确,但0x0013FCF0 应该压的是函数地址啊不知道为什么是 0x0013FCF8
因为0x0013FCF8依题意不可能是函数地址
以上是个人见解,等待高手
============
0x0013FCF8压的是func(i, szTest)后面的地址,不是函数本身的地址
如果紧接着又是一个函数调用,那么可能eip的指针完全不同与当前上下文
B|D都是可能的