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


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

点评

恩 赞同  发表于 2014-3-2 12:56
zj220223 · #2 · 2014-3-1 19:33:19  回复 支持 反对
数组都是要初始化的,如果初始化后,应该是101.。。c++ primer上有。。

点评

此题就是搞特殊情况的……  详情 回复 发表于 2014-3-1 23:31
浪子龙情 · #3 · 2014-3-1 19:49:22  回复 支持 反对
strlen只检测'\0'。数组没有初始化的时候,结果不确定。这题我刚才试了一下结果是103,估计是压入的ebp是0x00******格式的。不知道对不对

点评

我那里也是103,打印一下字符串是50多个的同一个繁体字  详情 回复 发表于 2014-3-1 23:30
zj220223 · #4 · 2014-3-1 21:42:54  回复 支持 反对
我说错了 strlen()只计算可见的字符,不把空字符计算在内。
vo_ · #5 · 2014-3-1 23:06:38  回复
加油~~

点评

这题 咋弄呢?  详情 回复 发表于 2014-3-1 23:29
小许 · #6 · 2014-3-1 23:29:22  回复 支持 反对

这题   咋弄呢?

点评

vo_
如果是局部变量就不确定,全剧变量该是0啊。。跑了下a[10]结果是15- -  详情 回复 发表于 2014-3-2 20:42
小许 · #7 · 2014-3-1 23:30:56  回复 支持 反对
浪子龙情 发表于 2014-3-1 19:49
strlen只检测'\0'。数组没有初始化的时候,结果不确定。这题我刚才试了一下结果是103,估计是压入的ebp是0x ...

我那里也是103,打印一下字符串是50多个的同一个繁体字
小许 · #8 · 2014-3-1 23:31:37  回复 支持 反对
zj220223 发表于 2014-3-1 19:33
数组都是要初始化的,如果初始化后,应该是101.。。c++ primer上有。。

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

点评

这题是不是考你要注意到初始化这个问题。。我感觉就应该考这个。。  详情 回复 发表于 2014-3-1 23:33
zj220223 · #9 · 2014-3-1 23:33:55  回复 支持 反对
小许 发表于 2014-3-1 23:31
此题就是搞特殊情况的……

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

点评

恩 问题是,答案是什么  详情 回复 发表于 2014-3-2 09:37
小许 · #10 · 2014-3-2 09:37:07  回复 支持 反对
zj220223 发表于 2014-3-1 23:33
这题是不是考你要注意到初始化这个问题。。我感觉就应该考这个。。

恩   问题是,答案是什么

点评

。。。答案你就说数组要初始化。。如果初始化了。。再说strlen函数的作用  详情 回复 发表于 2014-3-2 10:11
zj220223 · #11 · 2014-3-2 10:11:25  回复 支持 反对
小许 发表于 2014-3-2 09:37
恩   问题是,答案是什么

。。。答案你就说数组要初始化。。如果初始化了。。再说strlen函数的作用
antty · #13 · 2014-3-2 12:51:12  回复 支持 反对
...面试怎么会问这个问题

点评

好好准备理论知识吧,个人感觉软院复试不会在意语言细节。  详情 回复 发表于 2014-3-2 13:14
猜测而已  发表于 2014-3-2 12:57
antty · #14 · 2014-3-2 13:14:39  回复 支持 反对
antty 发表于 2014-3-2 12:51
...面试怎么会问这个问题

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

点评

恩 我说的这个是工作面试题  发表于 2014-3-3 10:42
vo_ · #15 · 2014-3-2 20:42:38  回复 支持 反对
小许 发表于 2014-3-1 23:29
这题   咋弄呢?

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

点评

我这a[10]也是15,别人跑得a[100]好像和我这一样的103  发表于 2014-3-2 21:20
水之淼淼 · #16 · 2014-3-3 18:27:00  回复 支持 反对
zj220223 发表于 2014-3-1 19:33
数组都是要初始化的,如果初始化后,应该是101.。。c++ primer上有。。

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

点评

我这里跑的就不是103.栈没有初始化的部分,默认值是0xcc也就是“烫”。 strlen(a)在测试的时候,就会一直找下去,直到找到'\0'为止。栈是向下生长的,但是strlen在检查的时候,是各高地址部分查找的,也就是向栈底  详情 回复 发表于 2014-4-3 13:34
strlen的部分了解了,本题的代码在不同机器上测试了结果是都是103,这个103不知是电脑时怎么得来的,应该不是随机了,可能是系统什么机制是一样的  发表于 2014-4-3 12:17
兲噫弄朲 · #18 · 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_LEN  20
int main()
{   
        char a[10];
        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也就结束了。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
兲噫弄朲 · #19 · 2014-4-3 13:44:57  回复 支持 反对
其实从面试者角度看,他想看到的无非就是。
(1)对经常用的一些库是否了解实质
(2)变量空间分配的区别是否清楚
(3)数据的初始化很确实很重要,不要因为初始化留下BUG
个人看法。

点评

这个说的很详细,很赞!  详情 回复 发表于 2014-4-3 16:34
小许 · #20 · 2014-4-3 16:34:31  回复 支持 反对
兲噫弄朲 发表于 2014-4-3 13:44
其实从面试者角度看,他想看到的无非就是。
(1)对经常用的一些库是否了解实质
(2)变量空间分配的区别 ...

这个说的很详细,很赞!
回帖
B Color Image Link Quote Code Smilies
Command + Enter
快速回复 返回顶部 返回列表