char a[100]; cout << strlen(a) << endl; 输出多少?为什么 |
[技术| 编程·课件·Linux] 一个C++的题目,可能面试会问的,求解
小许
· 发布于 2014-03-01 18:36
· 2864 次阅读
转载文章时务必注明原作者及原始链接,并注明「发表于 软院网 RuanYuan.Net 」,并不得对作品进行修改。
浪子龙情 发表于 2014-3-1 19:49 我那里也是103,打印一下字符串是50多个的同一个繁体字 |
小许 发表于 2014-3-2 09:37 。。。答案你就说数组要初始化。。如果初始化了。。再说strlen函数的作用 |
zj220223 发表于 2014-3-1 19:33 学长好腻害 |
这个应该就是考查两个知识点一个是对strlen函数的了解。它是测字符串长度,它检测的标准也就是遇到'\0'就认为字符串结束。 然后就是变量的空间分配问题,全局变量的话,不初始化是分配在.bss段。使用时,变量默认是0值的,这个默认就有点不靠谱了,码代码的时候自己注意点,不要利用这一点,如果系统不给你默认为0,那就有bug了。 所以当a[100]为全局时,不初始化时,strlen(a)就是0。初始化就要根据你初始化的值来定了。如:a[4]={'a','\0','b','c'}; strlen(a)肯定是1. 局部变量是分配在栈上,栈上原来的值是不定的。strlen(a)就将是一个随机的值。 |
本帖最后由 兲噫弄朲 于 2014-4-3 13:41 编辑 兲噫弄朲 发表于 2014-4-3 11:48 我这里跑的就不是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也就结束了。 |
兲噫弄朲 发表于 2014-4-3 13:44 这个说的很详细,很赞! |