我在这里做了一些愚蠢的事情,我无法确切地指出是什么:
void init_data(double **data, int dim_x, int dim_y) {
int i,j,k;
data = (double **) malloc(sizeof(double) * dim_x);
for (k = 0; k < dim_y; k++) {
data[k] = (double *) malloc(sizeof(double) * dim_y);
}
for (i = 0; i < dim_x; i++) {
for (j = 0; j < dim_y; j++) {
data[i][j] = ((double)rand()/(double)RAND_MAX);
}
}
}
在 main() 中,我执行以下操作:
double **dataA;
int dim = 10;
init_data(&dataA, dim, dim);
但是紧接着当我尝试打印数据时程序崩溃了:
int i,j;
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
printf("%d\n", dataA[i][j]);
我错过了什么?
谢谢
最佳答案
你在你的指针中犯了一些错误。您正在传递 &dataA
至 init_data
, 所以参数类型应该是 ***double
, 而不是 **double
.也是你的第一个malloc
正在初始化一个指针数组,而不是一个 double 组,所以它应该是 sizeof(double *) * dim_x
.下面的代码应该可以工作。
void init_data(double ***data_ptr, int dim_x, int dim_y) {
int i,j,k;
double **data;
data = (double **) malloc(sizeof(double *) * dim_x);
for (k = 0; k < dim_x; k++) {
data[k] = (double *) malloc(sizeof(double) * dim_y);
}
for (i = 0; i < dim_x; i++) {
for (j = 0; j < dim_y; j++) {
data[i][j] = ((double)rand()/(double)RAND_MAX);
}
}
*data_ptr = data;
}
void main() {
double **dataA;
int dim = 10;
init_data(&dataA, dim, dim);
int i,j;
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
printf("%f\n", dataA[i][j]);
}
你的第一个循环也应该有条件 k < dim_x
而不是 k < dim_y
.在当前情况下这无关紧要,因为两个维度相同,但如果不相同会导致问题。最后,你应该使用 %f
而不是 %d
在你的printf
,因为 double 以不同于整数的格式存储,你可能会得到乱码而不是你想要的。
关于C编程动态初始化二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11463455/