C 当字符串的长度大于它的长度时会发生什么';谁的角色?

C 当字符串的长度大于它的长度时会发生什么';谁的角色?,c,append,c-strings,C,Append,C Strings,在上面的代码中,结果字符串“the”后面是一堆零还是垃圾值?如果我知道这个字符串将越来越大,因为我将向它添加值,我该怎么办?这取决于情况 如果matrix\u string是一个全局变量,则剩余字节将初始化为零 如果matrix\u string是一个局部变量,那么剩余的字节(在包括尾随nul的前四个字节之后)是未初始化的 结果字符串“the”后面是一堆零还是垃圾值 “the”之后的字符将全部为零(或空字符)。您可以通过printfmatrix\u string[5]进行检查,例如,使用不同的控

在上面的代码中,结果字符串“the”后面是一堆零还是垃圾值?如果我知道这个字符串将越来越大,因为我将向它添加值,我该怎么办?

这取决于情况


如果
matrix\u string
是一个全局变量,则剩余字节将初始化为零


如果
matrix\u string
是一个局部变量,那么剩余的字节(在包括尾随nul的前四个字节之后)是未初始化的

结果字符串“the”后面是一堆零还是垃圾值


“the”之后的字符将全部为零(或空字符)。您可以通过printf
matrix\u string[5]
进行检查,例如,使用不同的控件
%c
(不显示任何内容)和
%d
(显示零)。

每当您初始化一个项目少于该数组所能容纳的项目的数组时,该数组的其余部分将初始化为零。使用字符串文字作为初始值设定项也不例外。使用字符串文字初始化数组时,字符串后面的所有数组元素都将初始化为零

以下引用自C11规范§6.7.9第21段(增加重点)

如果括号内的列表中的初始值设定项少于 是集合的元素或成员,或集合中的字符数较少 用于初始化已知大小的数组的字符串文字 是阵列中的元素,骨料的剩余部分应为 与具有静态存储的对象隐式初始化相同 持续时间

这就是§6.7.9第10段关于具有静态存储持续时间的对象初始化的内容

如果没有指定具有静态或线程存储持续时间的对象 显式初始化,然后:

  • 如果有指针类型,则初始化为空指针
  • 如果它有算术类型,则初始化为(正或无符号)零
  • 如果它是聚合,则根据这些规则(递归地)初始化每个成员,并且任何填充都初始化为零 比特
  • 如果是联合,则根据这些规则(递归地)初始化第一个命名成员,并初始化任何填充 零位
那么这条线呢

char matrix_string[1000] = "the";

't'
'h'
'e'
'\0'
放在数组的前四个元素中,并将其他996个元素设置为
0

C字符串应以null结尾。您的字符串应该是“the\0”@leetylor:Literal字符串(
“the”
)由编译器自动nul终止;不需要手动操作。啊,是的。已经有一段时间了…@GregHewgill,因此在编译器放置nul字符后,其余字符将被设置为0或未初始化,如下面所述?
matrix\u string
实际上不是字符串;我们只是简称它
matrix_string
是一个1000个字符的数组,其前4个字符恰好是有效字符串。我认为以下字节(在前4个字节之后)将始终为零,无论它是否为全局变量。如果将其设置为
static
,则此答案的第一个参数也将适用,不仅仅是全局变量。但是剩余的
996
字节未初始化。
char matrix_string[1000] = "the";