2014-06-19 46 views
0

strlen()被null终止?那么当strlen(c)和strlen()是什么时候,char c [] = {'1','1'}和char d [] = {'1','1','\ 0'}如何得到相同的输出2? (d)被使用?strlen如何为{'1','1'}和{'1','1',' 0'}给出相同的输出?

+1

'\ 0'是字符串终止的符号不为空 –

+2

可能在'c'数组中的第二个元素后面恰好有一个0。 –

+2

@AlexandruCimpanu ** C99标准**调用字符串“null-terminated”(例如p303)。 OP指的是空字符,而你可能正在考虑空指针或NULL(它不能保证是指针)。 –

回答

5

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

0

这只是你得到运气。

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

在您的d字符串中,将'\ 0'放在字符串的末尾。 strlen func然后返回2个字符。

在你的第二个函数里,在你的记忆里你有很多'\ 0',并且你的c字符串结尾的字符是'\ 0'。所以,它返回相同的值;)

+5

如果因为未定义的行为而发生作用,我会称之为*糟糕的运气。 – user694733

1

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

strlen(c)将返回> = 2 如果字符在位置c + 2 ==“\ 0”,那么你是幸运的,strlen(c)回报2,但你不能有任何的保障!

0

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

同样在写作时

char a [] =“hello”;

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

+1

除了你以外,没有人在讨论'NULL'。 –

1

strlen()被null终止?

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

请注意,NULL(全部大写)通常定义为0(在stddef.h中)的别名。

然而,上面所说的,在你的例子中,字符'c'和'd'的两个数组有不同的内容。前者包含两项,后三项。 strlen的有效输入只是你的'd'数组。你的数组'c'不是以null结尾的。

strlen返回正确的长度的原因无论如何是'c'被分配的区域包含,纯粹的机会,在数组的最后一个项目后的'\ 0'。

相关问题