为什么我在C中的多维动态分配不起作用?

Mar*_*ark 2 c arrays pointers indirection

我一直试图找出我在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));
   }
}  
Run Code Online (Sandbox Code Playgroud)

第二个:

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;
}
Run Code Online (Sandbox Code Playgroud)

两者都不起作用.在这两种情况下,每个cdr [i]最终都指向同一个地方.第一次进入'i'循环时,所有cdr [i](即cdr [0],cdr [1],cdr [2]等)都设置为相同的值.然后,后续循环不会更改它们中的任何一个.

我怀疑运算符优先级有问题,或者我解释错误,但我无法弄明白.

谢谢.

UPDATE

我把以下简化代码放在一起,这似乎工作正常.但是虽然输出完全符合预期,但我仍然会在调试器中逐步完成相同的奇怪行为.我开始认为我的代码的基本问题可能在其他地方,我刚刚被调试器的问题所转移(或者可能只是因为我对输出的误解).是否有一个众所周知的原因,为什么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;
}
Run Code Online (Sandbox Code Playgroud)

再次感谢所有反馈.

sse*_*vic 6

很久以前在大学时我得出结论,C中的多维数组应该用1D数组模拟.第一个需要分配足够大的缓冲区来容纳所有元素.对于2D阵列ncolumns*nrows*sizeof(element).然后通过将多维索引转换为1D索引来访问数组元素.对于2D数组,访问A(i,j)转换为bufA[i*ncolumns+j].