JDS*_*JDS 1 c memory arrays pointers
我在做一些愚蠢的事情,我无法准确地指出:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在main()中,我执行以下操作:
double **dataA;
int dim = 10;
init_data(&dataA, dim, dim);
Run Code Online (Sandbox Code Playgroud)
但是在那之后,当我尝试打印数据时程序崩溃了:
int i,j;
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
printf("%d\n", dataA[i][j]);
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
谢谢
你在指针中犯了一些错误.您将&dataA传递给init_data,因此参数类型应为***double,而不是**double.你的第一个malloc也是初始化一个指针数组,而不是一个双精度数组,所以它应该是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]);
}
Run Code Online (Sandbox Code Playgroud)
您的第一个循环也应该具有条件k <dim_x而不是k <dim_y.在当前情况下并不重要,因为两个维度都相同,但如果不是,则会引起问题.最后,你应该在你的printf中使用%f而不是%d,因为双打的格式与整数不同,你可能会得到比你想要的更多的乱码.