【问题标题】:Why does a char array need one element more than expected? [closed]为什么 char 数组需要比预期多一个元素? [关闭]
【发布时间】:2020-04-03 16:23:40
【问题描述】:

我注意到,通常当我将字符数组设置为所需的确切大小时,存储在该数组中的数据会损坏。为什么会发生这种情况,我应该为数组分配多少空间而不是存储数据所需的最大大小?

【问题讨论】:

  • “我注意到,通常当我将字符数组设置为所需的确切大小时,存储在该数组中的数据会损坏”——这不应该发生——除非你错过了空间对于空终止符,在这种情况下,您的数组不会损坏,但您的数组不是它需要的确切大小(它的 1 个元素太小了!)。
  • C 中的字符串以空值结尾。 strlen 返回字符数。 +1 占最后一个零字节。 en.wikipedia.org/wiki/C_string_handling
  • @Dai 您的评论没有意义,因为在不知道发生损坏的上下文的情况下,您无话可说。并且问题的作者没有提供任何相关代码。这个问题应该结束了。
  • 占用过多的内存不是一个好主意,这会使程序变慢。
  • “为什么会这样” --> 因为您对“它需要的确切大小”的理解是不正确的。通过显示代码和您认为它是确切大小的推理,这可能是一个好问题。

标签: c arrays string char


【解决方案1】:

为什么建议给数组提供比需要更大的大小?

并非所有数组类型都如此。不建议这样做,如果您没有设置比要求更多的元素,也不应该以任何方式触及您的数组内容。但是,有一个特殊的例外 - 将字符串存储在 chars 的数组中,如下所述。

我注意到,通常当我将字符数组设置为所需的确切大小时,存储在该数组中的数据会损坏。

当您想将字符串存储在char 数组中时,您必须考虑终止空字符 - \0

隐含该字符的原因是,字符串操作函数可以确定字符串的结尾,还可以检测char 数组的内容是否是字符串的一部分。

如果您不介意为该字符设置位置并尝试在该 char 数组中存储字符串,则程序将导致内存中的缓冲区溢出 - \0 将被写入数组边界之外它只有正确的字符串内容的空间,但没有空字符。

与存储数据所需的最大大小相比,我应该为数组分配多少空间?

只需要 1 个char 元素来保存\0

F.e.:

char a[6] = "hello";   

a 需要由 6 个元素组成,而不是 5 个元素,因为它需要包含终止空字符。

相比之下,

int b[5] = {1,2,3,4,5};

b 不需要比明确要求更多的元素。


因此,总而言之,当您想将字符串存储在 char 数组中时,意味着比单独存储字符串的正确字符所需的元素多一个。

【讨论】:

    【解决方案2】:

    这取决于您要存储在数组中的数据类型,并且可能有许多复杂的答案。

    一般来说,我会说你可以准确地分配你需要的数据,而不是一个字节。 对于字符串,请确保为空终止符分配一个额外的字节。

    有很多资源可以阅读有关数组操作的更多信息:

    https://www.cs.swarthmore.edu/~newhall/unixhelp/C_arrays.html

    https://www.cs.uic.edu/~jbell/CourseNotes/C_Programming/Arrays.html

    https://www.tutorialspoint.com/cprogramming/c_arrays.htm

    【讨论】:

      猜你喜欢
      • 2020-01-25
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 2021-12-24
      • 1970-01-01
      • 2021-05-08
      相关资源
      最近更新 更多