C ++ 2d静态数组和内存分配

时间:2018-10-13 12:51:08

标签: c++

我认为,我刚犯了一个错误:我正在分配静态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;
}

1 个答案:

答案 0 :(得分:0)

  

您能告诉我它有多糟吗-方法geta

不好。但是正确。 C++保证a的内存是连续的,并且内存布局是行主的,因此您的代码以正确的方式返回了预期的元素。让我们看看如何:

a[0]的类型为int[2000] 1)。但是,一旦对其进行算术运算,它就会衰减,即int*。因此,+i*N将指针移至i行(的起点),而+j将指针移至列j的指针。


1)实际上是int(&)[2000],但在这里并不重要