【问题标题】:Why arrays can be invoked out of bounds sometimes [duplicate]为什么有时可以越界调用数组[重复]
【发布时间】:2015-12-07 23:12:13
【问题描述】:

我写了一个C代码:

#include <stdio.h>
int main()
{
 int i;
 int a[4];
  for( i =0;i<5;i++)
 {
  a[i]=i;
  printf("a[%d]:%d ",i,a[i]);

  }
 return 0;
 }

我用gcc编译并成功运行,结果是:

a[0]:0 a[1]:1 a[2]:2 a[3]:3 a[4]:4

但是你可以看到数组 a 的大小为 4,从 0 到 3,我没有创建额外的内存来引用 a[4],并且意外地它运行并且似乎没有错误。在 Java,我查找数组的索引是否超出范围,它会抛出异常。我只是不知道为什么在 C 语言中它运行得很好。

【问题讨论】:

  • 请参阅Is accessing a global array outside its bound undefined behavior?,具体情况略有不同,但答案涵盖了所有相同的基础,一个对这个问题的回答。
  • 因为 C 没有对数组进行边界检查。当写信给a[4] 时,你只是在写内存中的某个地方。如果你幸运的话,你会得到一个Segfault,它会告诉你内存有问题。在大多数情况下,您只是破坏了那里的所有数据(它可能会在您的应用程序后期产生影响......然后“快乐调试”)。
  • @ShafikYaghmour a[4] 在这种情况下不是全局的!
  • @HappyCoder 是的,这就是为什么我说细节略有不同,但答案非常完整,对此的完整答案将涵盖几乎所有相同的领域。
  • 想想 undefined 的含义,就像在 undefined behavior 中一样。 (这就是您要调用的内容)。

标签: c arrays indexing


【解决方案1】:

C 不检查数组边界。 分段错误只会在您读取或写入您的程序无权访问的内存时发生。简单地越过数组边界不会让你的程序崩溃。

但是越界访问索引会调用未定义的行为

【讨论】:

  • 正确但不完整。
  • @immibis 是的,我正在修改它。请再看一遍。
猜你喜欢
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2014-11-17
相关资源
最近更新 更多