首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

迅雷笔试两个小疑点

2012-02-28 
迅雷笔试两个小问题1.charb[ ] {‘x’, ‘y’, ‘z’}为什么strlen(b) 72.如下C++程序int i 0x22222222

迅雷笔试两个小问题
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都是可能的

热点排行