Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C strlen()值如何自动更改?_C_String_Strlen - Fatal编程技术网

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++规范只是说任何事情都可能发生。(我猜您观察到的差异与堆栈对齐方式的变化有关。)