2016-05-14 55 views
-2

任何人都可以解释为什么这代码:为什么这两个看似相同的声明会导致不同的字符串长度?

char t1[20]; 
char t2[20]; 

memset(t1, 'B', sizeof(t1)); 
memset(t2, 'B', sizeof(t2)); 
printf("%lu\n", strlen(t1)); 
printf("%lu\n", strlen(t2)); 

结果:

22 
21 

感谢的

+3

注意,无论你得到的长度比实际的数组更长......你不必在一个空字符这个数组标记了字符串的末尾,所以'strlen()继续前进直到它找到一个数组(在数组的末尾)。 – Dmitri

+2

因为你没有终止任何字符串,所以你会得到垃圾结果。 –

+0

不能重现该问题。 – user3078414

回答

1

strlen希望得到一个(指针)C字符串。 C字符串是以空字符'\0'终止的char的数组。

当你memset你的char数组,你只需在每个元素中写一个'B',因此这两个数组都不是C字符串。将它们传递给strlen是未定义的行为。

为了解决这个问题,设置相应的每个数组的最后一个元素:

t1[19] = '\0'; 
t2[19] = '\0'; 
+0

有趣的是,不同的编译器似乎以不同的方式实现'memset'。 llvm铛似乎把'\ 0'放在尾部,而gcc则没有。无论如何,如果你以编程方式'空'终止'C字符串,你可以节省很多麻烦。 – user3078414

+1

@ user3078414这是一个错误的假设:clang当然不会**后面的''\ 0''。你最可能目睹的是零堆栈空间和某种对齐方式(64位机器?)的组合,所以在数组结束后实际上有一个空字节**。 –

+0

为了准确,这个“*'strlen'期望得到一个(指向a的指针)* C string *。*”应该读“*'strlen'期望得到一个(指向a的第一个元素的指针)* C string *。*“ – alk

相关问题