【发布时间】:2020-10-25 14:47:30
【问题描述】:
我正在尝试在 C++ 中创建一个矩阵,其形状像这样:
n = 行数; 例如,如果我输入 n = 4,我的矩阵应该如下所示: 1 23 456 78910
我已经成功完成了以下代码:
int n;
cout << "Introduceti n: ";
cin >> n;
int** a = new int*[n];
for (int i = 0; i < n; i++) {
a[i] = new int[i+1];
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < i+1; j++) {
*(*(a + i) + j) = (i * i + i) / 2 + j +1;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < i+1; j++) {
cout << *(*(a + i) + j) << "|";
}
cout << endl;
}
问题是:如果我指示指针停止在 a[0][0] 处初始化,为什么我可以访问 a[0][1] 并显示一个值?
【问题讨论】:
-
首先,对于任何指针或数组
a和索引i,表达式*(a + i)恰好等于a[i]。后者更容易阅读、书写和理解。特别是如果你有一个像你这样的锯齿状数组。 -
为什么我可以访问 a[0][1] -- C++ 不会阻止你做这样的坏事。 C++ 是一门强大的语言,但能力越大,责任越大。
-
C++ 中没有什么可以阻止您访问不应该访问的内存。如果你这样做,只是你的程序有undefined behaviour。
-
并且未初始化的内存是未初始化的。它将具有不确定的 内容和值,并且将这些值用于任何事物 会导致未定义的行为。 C++ 也没有任何边界检查,不超出边界是你的责任。
-
您在这里找到什么有用的东西了吗?为了 SO 社区的利益,您发布反馈是件好事。
标签: c++ arrays matrix memory dynamic