C编程动态初始化二维数组

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

在 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]);

我错过了什么?

谢谢

最佳答案

你在你的指针中犯了一些错误。您正在传递 &dataAinit_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/

相关文章:

java - 同时排序两个数组

java - 并发修改异常——设置数组元素

c# - 发送矩阵的方向...转换为度数?弧度?没有小数点的东西?

PHP x86 内存限制

c - 用空格和分号解析 CSV

c++ - 存储无效指针是否自动未定义的行为?

c - 将数组的内存分配给 char 指针

c - 具有指定提示的 getaddrinfo(3)->ai_socktype 不返回 IPv6 地址

javascript - 循环对象数组并合并它们(如果它们具有相似的键)

java - DOM 中的文件加载是如何工作的?