C编程动态初始化2D数组

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)

我错过了什么?

谢谢

Yun*_*chi 6

你在指针中犯了一些错误.您将&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,因为双打的格式与整数不同,你可能会得到比你想要的更多的乱码.