我一直在尝试找出我在C中分配和使用多维动态分配数组的问题。我非常感谢您的帮助。
我尝试了两种方法。首先:
cdr = (double ***) malloc(NUM_REGIONS * sizeof(double **));
for(i=0; i<NUM_REGIONS; i++){
cdr[i] = (double **) malloc(numRatings * sizeof(double *));
for(j=0; j<numRatings; j++){
cdr[i][j] = (double *) malloc(remQuarters * sizeof(double));
}
}
第二个:
tempPtr1 = (double *) malloc(NUM_REGIONS * numRatings * remQuarters * sizeof(double) );
tempPtr2 = (double **) malloc (NUM_REGIONS * numRatings * sizeof(double *));
cdr = (double ***) malloc(NUM_REGIONS * sizeof(double **));
for(i=0; i< NUM_REGIONS; i++){
cdr[i] = tempPtr2 + i;
for(j=0; j < numRatings; j++) cdr[i][j] = tempPtr1 + i * NUM_REGIONS + j;
}
都没有工作。在这两种情况下,每个cdr [i]最终都指向同一位置。我第一次进入“i”循环时,所有cdr [i](即cdr [0],cdr [1],cdr [2]等)都设置为相同的值。随后的循环则不会更改任何循环。
我怀疑运算符优先级正在发生问题,或者我正在错误引用,但是我无法弄清楚。
谢谢。
更新
我将以下简化的代码放在一起,似乎工作正常。但是,尽管输出完全符合预期,但在调试器中逐步执行它时,我仍然会得到相同的怪异行为。我开始认为我的代码的基本问题可能在其他地方,而我刚好被调试器的问题(或可能只是由于我对输出的误解)所困扰。是否有已知的原因,导致Visual Studio中的“cdr [0]”,“cdr [1]”等手表无法显示我期望的显示?
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#define NUM_REGIONS 50
void printArray(double *inVec, int len){
int i;
for(i=0; i<len; i++) printf("%f\t",inVec[i]);
printf("\n");
}
int main(array<System::String ^> ^args){
int numRatings = 25, remQuarters = 100, i, j, k;
double ***cdr;
char dummy;
cdr = (double ***) malloc(NUM_REGIONS * sizeof(double **));
for(i=0; i<NUM_REGIONS; i++){
cdr[i] = (double **) malloc(numRatings * sizeof(double *));
for(j=0; j<numRatings; j++){
cdr[i][j] = (double *) malloc(remQuarters * sizeof(double));
}
}
for(i=0; i<NUM_REGIONS; i++){
for(j=0; j<numRatings; j++){
for(k=0; k<remQuarters; k++){
cdr[i][j][k] = 100*i + 10*j +k;
}
}
}
for(i=0; i<5; i++) printf("%f\t",cdr[1][1][i]);
printf("\n");
for(i=0; i<5; i++) printf("%f\t",cdr[3][1][i]);
printf("\n");
for(i=0; i<5; i++) printf("%f\t",cdr[1][3][i]);
printf("\n");
for(i=0; i<5; i++) printf("%f\t",cdr[i][i][i]);
printf("\n");
printArray(cdr[1][1], 5);
printArray(cdr[3][3], 5);
scanf("%c", &dummy);
return 0;
}
再次感谢您的所有反馈。
最佳答案
很久以前,在大学里,我得出结论,应使用1D数组模拟C语言中的多维数组。首先,需要分配一个足够大的缓冲区来容纳所有元素。对于2D数组,应为ncolumns*nrows*sizeof(element)
。然后,通过将多维索引转换为一维索引来访问数组元素。对于2D数组,访问A(i,j)会转换为bufA[i*ncolumns+j]
。
关于c - 为什么我在C语言中进行多维动态分配不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3338160/