Arrays 在C中初始化字符数组而不设置数组大小时会发生什么

Arrays 在C中初始化字符数组而不设置数组大小时会发生什么,arrays,c,char,Arrays,C,Char,当我初始化一个字符数组,比如char str1[]={'a','b','c'}(数组大小未设置)并使用循环查找它的长度,直到str1[I]!='\0',我得到长度=4。相反,当我像char str2[10]={'a'、'b'、'c'}(数组大小已设置)那样初始化并使用相同的方法查找长度时,我得到length=3。为什么str1[3]包含垃圾值但不在str2[3]中?字符str1[]={'a','b','c'}创建一个由3个字符组成的数组,其值分别为'a'、'b'和'c'。数组的大小为3,您可以通

当我初始化一个字符数组,比如
char str1[]={'a','b','c'}
(数组大小未设置)并使用循环查找它的长度,直到
str1[I]!='\0'
,我得到
长度=4
。相反,当我像
char str2[10]={'a'、'b'、'c'}
(数组大小已设置)那样初始化并使用相同的方法查找长度时,我得到
length=3
。为什么
str1[3]
包含垃圾值但不在
str2[3]
中?

字符str1[]={'a','b','c'}
创建一个由3个字符组成的数组,其值分别为
'a'
'b'
'c'
。数组的大小为3,您可以通过str1的大小看到(这返回字节数,但当字符定义为1字节时,它与元素数相同)。尝试计算此数组中包含的字符串的长度会导致未定义的行为,因为
str1
不包含C样式字符串,因为它没有
'\0'
终止符。您的循环计算超出了数组的边界

charstr2[10]={'a','b','c'}
创建一个包含10个字符的数组,其值为
'a'
'b'
'c'
,以及7个
'\0'
s。数组的大小是10。在
str2
中计算字符串的长度得到3,因为
str2[3]
'\0'


如果要创建包含C样式字符串的数组而不指定大小,可以执行
char str[]={'a','b','C','\0'}
,或者更简单地说,
charstr[]=“abc”

char str1[]={'a','b','c'}
分配大小为3的字符数组
char str2[10]
分配一个大小为10的数组,您可以使用所需的值设置索引0,1,2。其余的仍被分配并可供使用,但包含垃圾值。
str1
中没有
'\0'
元素,因此您的循环超出了界限,这是未定义的行为。您可能访问了超出界限的第一个数组,导致了未定义的行为。第一个数组的大小为3,第二个数组的大小为10。注意:
char str[]=“abc”是初始化语法,而不是赋值。所以我们可以做一些修改,比如
str[2]='d'
使
str
变为
['a','b','d','\0']