一个C++的题目,可能面试会问的,求解
char a;cout << strlen(a) << endl;
输出多少?为什么
已经很清楚了啊,strlen()碰到'\0',结束计算‘\0’到传入地址之间的字节数。变量没有初始化的时候结果不确定,跟栈中较高地址存放的数据有关,接下来就没什么意义了。这题中较高地址应该是main函数被调用时压入的ebp或者编译器基于保护机制压入别的东西,编译器不同硬件平台不同这题结果不同。面试估计不会牛到讨论各种平台或编译器的压栈机制,你说呢???? 数组都是要初始化的,如果初始化后,应该是101.。。c++ primer上有。。 strlen只检测'\0'。数组没有初始化的时候,结果不确定。这题我刚才试了一下结果是103,估计是压入的ebp是0x00******格式的。不知道对不对 我说错了 strlen()只计算可见的字符,不把空字符计算在内。 加油~~ vo_ 发表于 2014-3-1 23:06
加油~~
这题 咋弄呢? 浪子龙情 发表于 2014-3-1 19:49
strlen只检测'\0'。数组没有初始化的时候,结果不确定。这题我刚才试了一下结果是103,估计是压入的ebp是0x ...
我那里也是103,打印一下字符串是50多个的同一个繁体字 zj220223 发表于 2014-3-1 19:33
数组都是要初始化的,如果初始化后,应该是101.。。c++ primer上有。。
此题就是搞特殊情况的…… 小许 发表于 2014-3-1 23:31
此题就是搞特殊情况的……
这题是不是考你要注意到初始化这个问题。。我感觉就应该考这个。。 zj220223 发表于 2014-3-1 23:33
这题是不是考你要注意到初始化这个问题。。我感觉就应该考这个。。
恩 问题是,答案是什么 小许 发表于 2014-3-2 09:37
恩 问题是,答案是什么
。。。答案你就说数组要初始化。。如果初始化了。。再说strlen函数的作用 ...面试怎么会问这个问题 antty 发表于 2014-3-2 12:51
...面试怎么会问这个问题
好好准备理论知识吧,个人感觉软院复试不会在意语言细节。 小许 发表于 2014-3-1 23:29
这题 咋弄呢?
如果是局部变量就不确定,全剧变量该是0啊。。跑了下a结果是15- - zj220223 发表于 2014-3-1 19:33
数组都是要初始化的,如果初始化后,应该是101.。。c++ primer上有。。
学长好腻害 这个应该就是考查两个知识点一个是对strlen函数的了解。它是测字符串长度,它检测的标准也就是遇到'\0'就认为字符串结束。
然后就是变量的空间分配问题,全局变量的话,不初始化是分配在.bss段。使用时,变量默认是0值的,这个默认就有点不靠谱了,码代码的时候自己注意点,不要利用这一点,如果系统不给你默认为0,那就有bug了。
所以当a为全局时,不初始化时,strlen(a)就是0。初始化就要根据你初始化的值来定了。如:a={'a','\0','b','c'};strlen(a)肯定是1.
局部变量是分配在栈上,栈上原来的值是不定的。strlen(a)就将是一个随机的值。 本帖最后由 兲噫弄朲 于 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也就结束了。
其实从面试者角度看,他想看到的无非就是。
(1)对经常用的一些库是否了解实质
(2)变量空间分配的区别是否清楚
(3)数据的初始化很确实很重要,不要因为初始化留下BUG
个人看法。 兲噫弄朲 发表于 2014-4-3 13:44
其实从面试者角度看,他想看到的无非就是。
(1)对经常用的一些库是否了解实质
(2)变量空间分配的区别 ...
{:6_160:} 这个说的很详细,很赞!{:10_455:}
页:
[1]