【问题标题】:Access to infinite array elements? [duplicate]访问无限数组元素? [复制]
【发布时间】:2016-08-28 19:05:03
【问题描述】:

我尝试理解指针。问题是:编译第二个 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

和持续的零。这是什么意思?

【问题讨论】:

标签: c++ arrays pointers


【解决方案1】:

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

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

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


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

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

【讨论】:

  • 所以如果我使用这些未初始化的元素,我总是会在进一步的代码中遇到未定义的行为,所以使用它们没有意义吗?所以我必须明确阻止用户访问它们?
猜你喜欢
  • 2016-11-17
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
相关资源
最近更新 更多