任何人都可以解释为什么这代码:为什么这两个看似相同的声明会导致不同的字符串长度?
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
感谢的
任何人都可以解释为什么这代码:为什么这两个看似相同的声明会导致不同的字符串长度?
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
感谢的
strlen
希望得到一个(指针)C字符串。 C字符串是以空字符'\0'
终止的char
的数组。
当你memset
你的char
数组,你只需在每个元素中写一个'B'
,因此这两个数组都不是C字符串。将它们传递给strlen
是未定义的行为。
为了解决这个问题,设置相应的每个数组的最后一个元素:
t1[19] = '\0';
t2[19] = '\0';
有趣的是,不同的编译器似乎以不同的方式实现'memset'。 llvm铛似乎把'\ 0'放在尾部,而gcc则没有。无论如何,如果你以编程方式'空'终止'C字符串,你可以节省很多麻烦。 – user3078414
@ user3078414这是一个错误的假设:clang当然不会**后面的''\ 0''。你最可能目睹的是零堆栈空间和某种对齐方式(64位机器?)的组合,所以在数组结束后实际上有一个空字节**。 –
为了准确,这个“*'strlen'期望得到一个(指向a的指针)* C string *。*”应该读“*'strlen'期望得到一个(指向a的第一个元素的指针)* C string *。*“ – alk
注意,无论你得到的长度比实际的数组更长......你不必在一个空字符这个数组标记了字符串的末尾,所以'strlen()继续前进直到它找到一个数组(在数组的末尾)。 – Dmitri
因为你没有终止任何字符串,所以你会得到垃圾结果。 –
不能重现该问题。 – user3078414