我认为,我刚犯了一个错误:我正在分配静态2D数组并将其作为1维进行访问。
您能告诉我它有多糟吗-方法 geta ?
下面的代码在我的Windows和Linux上都能正常工作: actual 始终等于 expected ,而 stride 始终等于 N 。
#include "stdafx.h"
#define N 2000
int a[N][N];
int geta(int i, int j) {
return *(a[0] + i * N + j);
}
int main()
{
printf("Hello\n");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
a[i][j] = i + j;
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int const expected = a[i][j];
int const actual = geta(i, j);
if (actual != expected) {
printf("wrong data at [%d,%d] expected=%d actual=%d", i, j, expected, actual);
}
}
}
for (int i = 1; i < N; i++) {
int stride = a[N] - a[N - 1];
if (stride != N) {
printf("wrong: i=%d c=%d N=%d", i, stride, N);
}
}
return 0;
}
答案 0 :(得分:0)
您能告诉我它有多糟吗-方法
geta
?
不好。但是正确。 C++
保证a
的内存是连续的,并且内存布局是行主的,因此您的代码以正确的方式返回了预期的元素。让我们看看如何:
a[0]
的类型为int[2000]
1)。但是,一旦对其进行算术运算,它就会衰减,即int*
。因此,+i*N
将指针移至i
行(的起点),而+j
将指针移至列j
的指针。
1)实际上是int(&)[2000]
,但在这里并不重要