【问题标题】:What happens when I initialize a char array without setting the array size in C当我初始化 char 数组而不在 C 中设置数组大小时会发生什么
【发布时间】:2021-01-24 01:36:15
【问题描述】:

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

【问题讨论】:

  • char str1[] = {'a','b','c'},分配一个大小为 3 的字符数组。char str2[10] 分配一个大小为 10 的数组,并使用所需的值设置索引 0,1,2。其余部分仍被分配并可供使用,但包含垃圾值。
  • str1 中没有元素是 '\0',所以你的循环超出了界限,这是未定义的行为
  • 您可能访问了第一个数组越界导致未定义的行为。第一个数组大小为 3,而第二个数组大小为 10。

标签: arrays c char


【解决方案1】:

char str1[] = {'a', 'b', 'c'}; 创建一个包含 3 个字符的数组,其值为 'a''b''c'。数组的大小为 3,您可以使用 sizeof str1 看到它(这会返回字节数,但由于 char 被定义为 1 字节,因此它与元素数相同)。尝试计算包含在此数组中的字符串的长度会导致 未定义的行为,因为 str1 确实 包含 C 风格的字符串,因为它没有 '\0' 终止符.您的循环计算超出了数组的范围。

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

如果你想创建一个包含 C 风格字符串而不指定大小的数组,你可以使用 char str[] = {'a', 'b', 'c', '\0'};,或者更简单地说,char str[] = "abc";

【讨论】:

  • 注意:char str[] = "abc";initialization 语法,而不是赋值。所以我们可以像str[2] = 'd';这样修改,使str变成['a', 'b', 'd', '\0']
猜你喜欢
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
相关资源
最近更新 更多