【问题标题】:How many elements can be inserted in an array of size 5? [duplicate]一个大小为 5 的数组中可以插入多少个元素? [复制]
【发布时间】:2021-05-05 01:16:57
【问题描述】:

如果我像这样int arr[5]; 在 C/C++ 中声明一个数组,然后像这样在其中插入元素的循环

for(int i=0; i<5; i++){
    arr[i] = i+1;
}

当我像这样打印这些元素时

for(int i=0; i<5; i++){
    printf("%d ", arr[i]);
}

元素照常打印,即1 2 3 4 5

但是如果这些循环像这样再运行一次

for(int i=0; i<=5; i++){
    arr[i] = i+1;
}

还有这个

for(int i=0; i<=5; i++){
    printf("%d ", arr[i]);
}

然后输出为1 2 3 4 5 6

所以,我不明白一个大小为 5 的数组本身怎么会有 6 个元素?

【问题讨论】:

  • for(int i=0; i&lt;=5; i++){ arr[i] = i+1; } 此代码通过越界访问索引表现出未定义的行为。 “似乎有效”是未定义行为的一种可能表现形式。
  • 当我用一根只能承受 900 磅的绳子悬挂 1000 磅的重量时,绳子不会断裂。为什么?这基本上就是你要问的。它可能会破裂,它可能会永远保持下去,它可能会为您的朋友而破裂,但在您尝试时不会破裂,等等。
  • 但是一旦我访问 arr[6] 它就会给我一个错误,为什么不在 arr[5]?
  • @ornvyr -- 解释为什么被破坏的代码会以它的方式运行是没有意义的。在另一个编译器、其他编译器设置等上,该代码可能会做不同的事情。
  • (It's complicated) 其实很简单,每周至少要问 20 次相同的问题。关闭作为一个非常常见的欺骗

标签: c++ arrays c


【解决方案1】:

那个大小为 5 的数组没有 6 个元素,实际上您正在从不属于该数组的内存中写入和读取,您可以获得输出 6,因为您在读取之前写入了那块内存那里。实际上,如果您编写 6,做很多事情并在程序结束时读取该内存,您就有机会“随机”读取某些内容,而不是 6

为了更好的解释检查How dangerous is it to acces an array out of bounds.

【讨论】:

    【解决方案2】:

    仅仅是因为 C 不检查数组边界。

    超出数组边界的读写在 C 中是一种未定义的行为,在其他语言中它会返回异常(例如,Java 中的IndexOutOfBoundsException)。在您的情况下,尝试读取 arr[i] 只会显示存储在接下来 4 个字节内存中的任何值(就在数组末尾之后)。

    查看这里以获得进一步的解释:No out of bounds error

    【讨论】:

      猜你喜欢
      • 2013-04-04
      • 2021-12-17
      • 2018-02-26
      • 2014-06-05
      • 2018-01-23
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      相关资源
      最近更新 更多