在C中动态分配2D数组

Car*_*ron 2 c pointers memory-management multidimensional-array

首先,我不是C编程的专家,我现在正在阅读一些遗留的C代码.在那里,我找到了以下函数来初始化2D矩阵:

long int **computeDistanceMatrix(void){
    long int i;
    long int j;
    long int ** matrix;
    matrix = malloc(sizeof(long int) * numberOfCities * numberOfCities +
        sizeof(long int *) * numberOfCities);

    if(matrix == NULL){
        fprintf(stderr, "Out of memory, exit.");
        exit(1);
    }

    for (i = 0; i < numberOfCities; i++){
        matrix[i] = (long int*) (matrix + numberOfCities) + i * numberOfCities;
        for (j = 0; j < numberOfCities; j++){
            matrix[i][j] = distanceFunction(i, j);
        }
    }
    return matrix;
}
Run Code Online (Sandbox Code Playgroud)

我发现代码有点奇怪,因为我期待一些更类似的东西,这对我来说似乎更清楚.无论如何,我想知道以下内容:

  • 该行malloc(sizeof(long int) * numberOfCities * numberOfCities + sizeof(long int *) * numberOfCities)意味着他们为数据项分配内存和指向每一行的指针?
  • 究竟是什么意思matrix[i] = (long int*) (matrix + numberOfCities) + i * numberOfCities?我真的没有得到他们想做的事情.
  • 有没有更简单的方法为C中的2D数组进行内存分配,或者这是正确的方法?

Jen*_*edt 5

据我所知,到目前为止,人们只提出了二维矩阵的仿真.

从C99开始,C具有可变长度数组VLA的概念,允许分配具有动态边界的适当2D矩阵.因为通常这些对于堆栈来说太大了,所以你必须分配它们malloc,如下所示:

double (*A)[n] = malloc(sizeof(double[n][n]));
Run Code Online (Sandbox Code Playgroud)

没有复杂的指针指针方案指针,只需要一个连续对象的单一分配.然后,您可以简单地访问该矩阵的元素,A[i][j]并且编译器正在为您执行所有索引计算.

所以无论何时你(你没有遗留代码强加指针指针,你有一个支持C99的编译器)你应该使用它.它更简单,更不容易出错,效率更高.