运行以下代码时,为什么不出错?

Muh*_*eel -3 c++ pointers undefined-behavior dynamic-memory-allocation visual-c++

我正在运行以下代码,其中我声明了一个动态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;
    }
Run Code Online (Sandbox Code Playgroud)

我得到的输出的链接在这里(值实际上是准确分配的,但不知道为什么).

The*_*kis 5

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

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

本国际标准没有要求的行为.

  • @MuhammadFaiqueShakeel为了避免未定义的行为,你需要充分了解C++的规则并且要小心,这样你就不会编写一个调用未定义行为的程序.应该不惜一切代价避免未定义的行为,因为它是不可预测的,并且因为它可能并且将导致严重的问题,包括崩溃,奇怪的程序流,数据损坏,安全漏洞等等.正如您在本示例中所注意到的,试错法是学习C++的一种特别糟糕的方法,因为遗憾的是,有效的实现可能会有很大差异. (2认同)