为什么我运行以下代码时没有收到错误

时间:2015-07-01 09:49:39

标签: c++ pointers visual-c++ undefined-behavior dynamic-memory-allocation

我正在运行以下代码,其中我声明了一个动态2D数组,然后继续为列索引分配高于实际为动态数组分配的数字列的值。但是,当我这样做时,代码运行完美,我不会收到错误,我相信我应该得到错误。

 void main(){


        unsigned char **bitarray = NULL;
        bitarray = new unsigned char*[96];

        for (int j = 0; j < 96; j++)
        {
                bitarray[j] = new unsigned char[56];
            if (bitarray[j] == NULL)
            {
                cout << "Memory could not be allocated for 2D Array.";
                return;// return if memory not allocated
            }
        }

        bitarray[0][64] = '1';
        bitarray[10][64] = '1';

        cout << bitarray[0][64] << " " << bitarray[10][64];

        getch();
        return;
    }

The link to the output I get is here(这些值实际上是准确分配的,但不知道为什么)。

3 个答案:

答案 0 :(得分:5)

在C ++中,从边界中访问缓冲区会调用未定义的行为(不是预期的陷阱错误)。

C ++规范将术语未定义行为定义为:

  

本国际标准强加无要求的行为。

答案 1 :(得分:4)

在您的代码中,两者

    bitarray[0][64] = '1';
    bitarray[10][64] = '1';

正在访问超出范围的内存。即,那些存储位置是“无效的”。访问无效内存会调用undefined behaviour

访问冲突错误或分段错误是UB的许多可能结果之一。没有任何保证。

来自wiki page for segmentation fault

  

在使用硬件内存分段来提供虚拟内存的系统上,当硬件检测到尝试引用不存在的段或引用段的边界之外的位置时,会发生分段错误....

所以,也许,只是可能bitarray[0][64]的内存区域位于已分配的页面(段)内,该页面可被程序访问(但无论如何都是无效的),在此非常特别案件。这并不意味着它永远都是。

尽管如此,void main()不是main()函数的正确签名。 C++11的推荐(main(),§3.6.1)签名为int main(void)

答案 2 :(得分:3)

C ++ 11引入了std::array,方法at()提供了越界检查。