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']
。