C strlen()值如何自动更改?
我写了这段代码-C strlen()值如何自动更改?,c,string,strlen,C,String,Strlen,我写了这段代码- char s1[10] = "he", s2[20] = "she", s3[30], s4[30]; printf("%d %d", strlen(s2) + strlen(s3), strlen(s4)); char s1[10] = "he", s2[20] = "she", s3[30], s4[30]; printf("%d %d", strlen(s3), strlen(s4)); 输出- 6 9 0 3 然后我写了这个代码- char s1[10]
char s1[10] = "he", s2[20] = "she", s3[30], s4[30];
printf("%d %d", strlen(s2) + strlen(s3), strlen(s4));
char s1[10] = "he", s2[20] = "she", s3[30], s4[30];
printf("%d %d", strlen(s3), strlen(s4));
输出-
6 9
0 3
然后我写了这个代码-
char s1[10] = "he", s2[20] = "she", s3[30], s4[30];
printf("%d %d", strlen(s2) + strlen(s3), strlen(s4));
char s1[10] = "he", s2[20] = "she", s3[30], s4[30];
printf("%d %d", strlen(s3), strlen(s4));
通过删除strlen(s1)+
输出-
6 9
0 3
我的问题是字符串s4的长度如何变化?
s3
和s4
没有初始化,也不是'\0'
终止的C字符串,这是strlen()
所期望的。因此,您无法将它们传递给strlen()
您看到的是。您说的是“字符串s4”,但
s4
不包含字符串。它是一个没有特定内容的字符数组。只能对C样式字符串执行strlen
。所以你的代码被破坏了。它的行为将是不可预测的。s3
和s4
未初始化,因此可能是未定义的行为。在第一个示例中,s4
未初始化,因此strlen(s4)
可以是任何东西。实际上,strlen(s3)
也是如此,因为s3
是未初始化的。这在一定程度上取决于变量的定义位置。如果它们是全局的,它们将被初始化,但是如果它们是函数的局部的,它们就不会被初始化。我在一本书中读到了这一点,书中问到第一个代码的结果是什么?然后我试图删除'strlen(s2)+',我发现了这种模糊性。可能是,这本书在使用strlen()
或将它们作为全局变量之前,对s3
和s4
进行了初始化或赋值?如果不是,这本书是错误的。考虑改变你的教科书,并使用一个更好的。这是我在一本书中读到的,书中有人问,第一个代码的结果是什么?然后我试图删除'strlen(s2)+',我发现了这种歧义。@AkhilRaj答案是代码被破坏了,无法预测结果。深入了解一个特定的实现(库,编译器,OS),您可能能够预测在那个特定平台上发生了什么,但是C++规范只是说任何事情都可能发生。(我猜您观察到的差异与堆栈对齐方式的变化有关。)