小许 发表于 2014-3-1 18:36:11

一个C++的题目,可能面试会问的,求解

char a;
cout << strlen(a) << endl;
输出多少?为什么


浪子龙情 发表于 2014-3-2 10:48:39

已经很清楚了啊,strlen()碰到'\0',结束计算‘\0’到传入地址之间的字节数。变量没有初始化的时候结果不确定,跟栈中较高地址存放的数据有关,接下来就没什么意义了。这题中较高地址应该是main函数被调用时压入的ebp或者编译器基于保护机制压入别的东西,编译器不同硬件平台不同这题结果不同。面试估计不会牛到讨论各种平台或编译器的压栈机制,你说呢????

zj220223 发表于 2014-3-1 19:33:19

数组都是要初始化的,如果初始化后,应该是101.。。c++ primer上有。。

浪子龙情 发表于 2014-3-1 19:49:22

strlen只检测'\0'。数组没有初始化的时候,结果不确定。这题我刚才试了一下结果是103,估计是压入的ebp是0x00******格式的。不知道对不对

zj220223 发表于 2014-3-1 21:42:54

我说错了 strlen()只计算可见的字符,不把空字符计算在内。

vo_ 发表于 2014-3-1 23:06:38

加油~~

小许 发表于 2014-3-1 23:29:22

vo_ 发表于 2014-3-1 23:06
加油~~

这题   咋弄呢?

小许 发表于 2014-3-1 23:30:56

浪子龙情 发表于 2014-3-1 19:49
strlen只检测'\0'。数组没有初始化的时候,结果不确定。这题我刚才试了一下结果是103,估计是压入的ebp是0x ...

我那里也是103,打印一下字符串是50多个的同一个繁体字

小许 发表于 2014-3-1 23:31:37

zj220223 发表于 2014-3-1 19:33
数组都是要初始化的,如果初始化后,应该是101.。。c++ primer上有。。

此题就是搞特殊情况的……

zj220223 发表于 2014-3-1 23:33:55

小许 发表于 2014-3-1 23:31
此题就是搞特殊情况的……

这题是不是考你要注意到初始化这个问题。。我感觉就应该考这个。。

小许 发表于 2014-3-2 09:37:07

zj220223 发表于 2014-3-1 23:33
这题是不是考你要注意到初始化这个问题。。我感觉就应该考这个。。

恩   问题是,答案是什么

zj220223 发表于 2014-3-2 10:11:25

小许 发表于 2014-3-2 09:37
恩   问题是,答案是什么

。。。答案你就说数组要初始化。。如果初始化了。。再说strlen函数的作用

antty 发表于 2014-3-2 12:51:12

...面试怎么会问这个问题

antty 发表于 2014-3-2 13:14:39

antty 发表于 2014-3-2 12:51
...面试怎么会问这个问题

好好准备理论知识吧,个人感觉软院复试不会在意语言细节。

vo_ 发表于 2014-3-2 20:42:38

小许 发表于 2014-3-1 23:29
这题   咋弄呢?

如果是局部变量就不确定,全剧变量该是0啊。。跑了下a结果是15- -

水之淼淼 发表于 2014-3-3 18:27:00

zj220223 发表于 2014-3-1 19:33
数组都是要初始化的,如果初始化后,应该是101.。。c++ primer上有。。

学长好腻害

兲噫弄朲 发表于 2014-4-3 11:48:52

这个应该就是考查两个知识点一个是对strlen函数的了解。它是测字符串长度,它检测的标准也就是遇到'\0'就认为字符串结束。
然后就是变量的空间分配问题,全局变量的话,不初始化是分配在.bss段。使用时,变量默认是0值的,这个默认就有点不靠谱了,码代码的时候自己注意点,不要利用这一点,如果系统不给你默认为0,那就有bug了。
所以当a为全局时,不初始化时,strlen(a)就是0。初始化就要根据你初始化的值来定了。如:a={'a','\0','b','c'};strlen(a)肯定是1.
局部变量是分配在栈上,栈上原来的值是不定的。strlen(a)就将是一个随机的值。

兲噫弄朲 发表于 2014-4-3 13:34:56

本帖最后由 兲噫弄朲 于 2014-4-3 13:41 编辑

兲噫弄朲 发表于 2014-4-3 11:48
这个应该就是考查两个知识点一个是对strlen函数的了解。它是测字符串长度,它检测的标准也就是遇到'\0'就认 ...
我这里跑的就不是103.栈没有初始化的部分,默认值是0xcc也就是“烫”。strlen(a)在测试的时候,就会一直找下去,直到找到'\0'为止。栈是向下生长的,但是strlen在检查的时候,是各高地址部分查找的,也就是向栈底的方向找,这样肯定会找到有数据的区域,这样碰到是‘\0’的概率就会增大。但是也因为是概率的,所以说这个测试的值是随机的。当然,你针对同一个程序,同一台机器来跑的话,就不一样了。你可以查看栈上压入的内容,就可以确认具体的值了。
#define SHOW_LEN20
int main()
{   
      char a;
      char *p=a+10;                                                //我们从该数组的下一个字节开始查看
      int i = 0;
      for(;i < SHOW_LEN;i++)                //先查看20个字节,如果没有遇到'\0',可以加大查看长度
      {
                printf("%2x,",(unsigned char)*p++);
      }
      printf("%d",strlen(a));
      return 0;
}
程序运行结果:
这个时候就可以数出来了10+13,也就是数组后面栈上内容连续13个字节都是非0值。0xcc是栈没有初始化的默认值(传说中的‘烫’),打印a[]的值,也会是这个,这里说明,分配a[]空间的时候,编译器是预留了空间的,然后就是栈的其它数据了,像ebp,eip的值。这些值的某一个字节就可能是0值,那么当strlen扫到0也就结束了。


兲噫弄朲 发表于 2014-4-3 13:44:57

其实从面试者角度看,他想看到的无非就是。
(1)对经常用的一些库是否了解实质
(2)变量空间分配的区别是否清楚
(3)数据的初始化很确实很重要,不要因为初始化留下BUG
个人看法。

小许 发表于 2014-4-3 16:34:31

兲噫弄朲 发表于 2014-4-3 13:44
其实从面试者角度看,他想看到的无非就是。
(1)对经常用的一些库是否了解实质
(2)变量空间分配的区别 ...

{:6_160:} 这个说的很详细,很赞!{:10_455:}
页: [1]
查看完整版本: 一个C++的题目,可能面试会问的,求解