访问无限数组元素?

小星 编程 65

这个问题在这里已经有了答案:





Accessing an array out of bounds gives no error, why?

(18 个回答)


5年前关闭。




我试图理解指针。问题是:编译第二个 for 循环时不应该出现段错误吗?如果没有,为什么不呢?我无法阻止对 y[0][dim] 之外的元素的任何访问。

int main(){                                                                                                   
        int dim = 3;                                                                                          
        int ordnung = 2;                                                                                      
        double** y = new double*[ordnung];                                                                    

        for(int i = 0; i<ordnung; i++){                                                                       
                y[i] = new double[dim];                                                                       
        }                                                                                                     

        for(int i = 0; i<=100; i++){                                                                          
                cout << y[0][i] << endl;                                                                      
        }                                                                                                     

        delete[] y;                                                                                           
        return 0;                                                                                             
}   

输出也让我感到困惑:
0
0
0
1.63042e-332
0
0
0
6.520933e-319

和持续的零。这意味着什么?

回复

共1条回复 我来回复
  • 编程小能手
    编程小能手
    来自于宇宙以外的编程小能手~
    评论

    当您使用 new[] 分配内存时,它不会以任何特定方式初始化内存。它的内容是不确定的,访问它,即使是为了阅读,也会导致未定义的行为。

    您还会超出分配的内存范围,这也会导致未定义的行为。 C++ 没有内置的边界检查。

    然后你不会释放你分配的所有内存。对于每个 new应该有一个匹配的delete ,并且对于每个 new[]一个匹配的delete[] .

    最后几点注意事项:首先,如果您认为您需要一个动态数组,那么您的下一个想法应该是 std::vector .

    关于使用 new 时未初始化的内存或 new[] ,这当然取决于您分配的内容。如果您使用构造函数分配对象(或对象数组),那当然会导致构造函数被调用。构造函数可能会也可能不会初始化对象。

    2025-04-13 15:07:01 1条评论