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

标签 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));
   }
}  

第二个:

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]”等 watch 无法显示我期望的内容?

#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;
}

再次感谢所有反馈。

最佳答案

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

关于c - 为什么我在 C 中的多维动态分配不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3338160/

相关文章:

c - 为什么要在函数序言/结语中使用 ebp?

结构问题

c - 使用 C 在单个 printf 语句中打印多个不同的内容

c - 使用 a[i] 和 *(a + i) 有区别吗?

c - 将数组分配给具有复杂情况的指针

c - 在运行时声明和初始化 C 中的类数组

C : text file, 字符串比较等

c++ - 结构内存分配中的 char*

c - qsort 在 c 中按字典顺序对字符串进行排序

php - 检查PHP数组是否为空值,如果为空,则用默认值填充该特定键的值。