访问无限数组元素?
编程 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
和持续的零。这意味着什么?
-
当您使用
new[]
分配内存时,它不会以任何特定方式初始化内存。它的内容是不确定的,访问它,即使是为了阅读,也会导致未定义的行为。
您还会超出分配的内存范围,这也会导致未定义的行为。 C++ 没有内置的边界检查。
然后你不会释放你分配的所有内存。对于每个new
应该有一个匹配的delete
,并且对于每个new[]
一个匹配的delete[]
.
最后几点注意事项:首先,如果您认为您需要一个动态数组,那么您的下一个想法应该是std::vector
.
关于使用new
时未初始化的内存或new[]
,这当然取决于您分配的内容。如果您使用构造函数分配对象(或对象数组),那当然会导致构造函数被调用。构造函数可能会也可能不会初始化对象。2025-04-13 15:07:01