【发布时间】:2011-03-21 06:30:24
【问题描述】:
我一直试图找出我在 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;
}
再次感谢所有反馈。
【问题讨论】:
-
我试过你的第一个 sn-p。它和我一起工作。而且 cdr[i] 每次都是一个新位置,没有任何问题。
-
我的猜测是:你的 numRatings 变量等于 0 或未初始化
-
@stacker, cdr 被声明为 double ***cdr;声明中还有一些其他变量,但这不重要,不是吗? @Ben,numRatings 等于 27。在调试器中显示良好。
-
@Mark 因为它被声明为***指针,所以编译器无法找出你的第一个索引的行有多大,因此 ssegiv 答案是要走的路。
-
您确定这不能正常工作吗?你看到了什么地址?你确定地址完全一样吗?您的第一种方法似乎是有效的,我的测试证实了这一点。
标签: c arrays pointers indirection