【问题标题】:Not getting ArrayOutofBounds Exception for 2d array没有得到二维数组的 ArrayOutofBounds 异常
【发布时间】:2013-12-08 18:00:27
【问题描述】:

我似乎遇到了一个问题,当我访问超出数组范围的索引时,我的编译器没有正确地给我一个异常。

例如: 在我的代码中我有

int reds[8][8];

这应该创建一个高度为 8(0-7) 和宽度为 8(0-7) 的二维数组。 问题是,我以后有以下代码行:

reds[0][8] = 1;
reds[0][65] = 1;

我的代码编译良好,没有错误。但是,我的程序显然不能按我想要的方式工作。

if(reds[r][column] > 0){
        if(column == 0) Red1_Write(0);
        if(column == 1) Red2_Write(0);
        if(column == 2) Red3_Write(0);
        if(column == 3) Red4_Write(0);

if 语句在每次不应该出现的时候进入。将第 0 行第 1 到第 3 列的数组值设置为零。我做错了什么?

【问题讨论】:

  • 是的,您对所使用的语言感到困惑。这是 C,不是 Java。
  • 我认为 C 不会对数组进行边界检查。在大多数情况下,它会让你做你想做的事,并假设你知道自己在做什么……所以你当然应该知道自己在做什么……
  • 异常”?哪些例外?

标签: c arrays


【解决方案1】:

欢迎来到“C”。 “C”中的数组没有边界检查。访问数组末尾的索引会导致未定义的行为(即崩溃和其他奇怪的行为)。

由程序员决定以防止这种情况发生的方式进行编码。如果您还没有这样做,请查看 C++ 标准库(基于旧的 STL),它提供了帮助您管理这种情况的通用容器类。这显然只有在您可以在程序中使用 C++ 编译器时才有用。

STL:http://www.sgi.com/tech/stl/
微软:http://msdn.microsoft.com/en-us/library/cscc687y.aspx

【讨论】:

  • "它会崩溃",如果你幸运的话。
  • 我会谨慎建议越界访问会导致崩溃。经常,程序可以正常访问OOB内存,导致非常奇怪的行为,但没有崩溃。
  • 另外,我们不再使用 STL。您说的可能是 C++ 标准库。
  • 问题只标记为 c,数组不是 c++
猜你喜欢
  • 2014-11-07
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 2019-08-17
  • 2013-05-01
相关资源
最近更新 更多