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?我真的没有得到他们想做的事情.据我所知,到目前为止,人们只提出了二维矩阵的仿真.
从C99开始,C具有可变长度数组VLA的概念,允许分配具有动态边界的适当2D矩阵.因为通常这些对于堆栈来说太大了,所以你必须分配它们malloc,如下所示:
double (*A)[n] = malloc(sizeof(double[n][n]));
Run Code Online (Sandbox Code Playgroud)
没有复杂的指针指针方案指针,只需要一个连续对象的单一分配.然后,您可以简单地访问该矩阵的元素,A[i][j]并且编译器正在为您执行所有索引计算.
所以无论何时你(你没有遗留代码强加指针指针,你有一个支持C99的编译器)你应该使用它.它更简单,更不容易出错,效率更高.