strlen如何为{' 1',' 1'}和{' 1',' 1',&#39提供相同的输出; \ 0'}?

时间:2014-06-19 12:03:50

标签: c arrays null strlen

strlen()以null结尾吧?那么char c [] = {' 1',' 1'}和char d [] = {' 1',' 1&# 39;,' \ 0'}在使用strlen(c)和strlen(d)时给出相同的输出2?

5 个答案:

答案 0 :(得分:5)

前者是未定义的行为;它可以输出2,它也可以输出500,终止你的程序或破坏你的计算机。

答案 1 :(得分:1)

strlen(d)将返回2,没问题。

strlen(c)将返回> = 2。 如果位置c + 2 ==' \ 0'中的字符,那么您很幸运,strlen(c)返回2,但您无法保证!

答案 2 :(得分:1)

  

strlen()以null结束吧?

我认为使用错误的术语会产生一些混淆:“strlen”是C标准函数的名称;函数不是“以null结尾”。如果你的意思是strlen应该用于以null结尾的字符序列,那么“null-terminated”意味着'\ 0'是决定序列结束的最终哨兵字符,那么是:strlen做到了。

请注意,NULL(所有大写字母)通常被定义为0的别名(在stddef.h中)。

但是,上面说的是,示例中的两个字符“c”和“d”数组具有不同的内容。前者包含两个项目,后三个项目。 strlen的有效输入只是你的'd'数组。你的数组'c'不是以空值终止的。

strlen返回正确长度的原因是分配'c'的区域纯粹偶然包含数组中最后一项之后的'\ 0'。

答案 3 :(得分:0)

只是你得到了运气。

strlen()函数将开始计数,直到找到' \ 0'。

在你的字符串中,你放了' \ 0'在你的字符串的末尾。 strlen func然后返回2个caracters。

在你的第二个中,幸运的是,在你的记忆中你得到了许多' \ 0'无处不在,c字符串末尾的字符是' \ 0'。因此,它返回相同的值;)

答案 4 :(得分:0)

\ 0标记字符串的终止字符不是NULL。 strlen在给定字符串时不计算终止字符,它会计数直到找到\ 0然后停止并返回。

同时写作

char a [] ="你好" ;

这为hello分配了6个内存空间5,为\ 0分配了1个内存空间。 在大多数情况下,strlen(c)不会是2