【问题标题】:C: declare multidimensional arrays without size?C:声明没有大小的多维数组?
【发布时间】:2020-03-06 07:35:58
【问题描述】:

我正在尝试像这样声明一个长的二维数组,以便稍后将长数组复制到大小合适的小数组中:

double arr_long[MAX][2]; double arr[][];

这样我以后可以使用:

arr = malloc(amount*sizeof(double[2]));

然后复制所有元素。 (我正在用一个简单的 for 循环填充长数组) 但是我的编译器给了我一个错误,说关于声明“数组类型的元素类型不完整”。 不指定大小就不能声明多维数组吗?

【问题讨论】:

  • 你可以做一个指向 2 数组的指针。double (*arr)[2]。但是struct something { double elements[2]; }struct something *arr; 更容易

标签: c multidimensional-array malloc


【解决方案1】:

有没有办法在不指定大小的情况下声明多维数组?

您必须了解除“最后”/最“上”维度之外的所有维度。因为要分配内存,您必须知道数组中元素的大小。至于您的情况,这很简单-您分配了一个包含两个双精度数的数组。

你可以做一个指向 2 个双元素数组的指针:

double (*arr)[2];
// you can normally allocate
arr = malloc(sizeof(*arr) * amount);
// and normally iterate
for (size_t i = 0; i < amount; ++i) {
  for (size_t j = 0; j < 2; ++j) {
     printf("%f", arr[i][j]);
  }
}

*arr 的类型是double[2],因此sizeof(*arr) 将正确解析为sizeof(double[2])

【讨论】:

    【解决方案2】:

    您正在尝试更改 arr ( this 指向的位置)的值,这是一个错误,因为这种类型的指针不能重新指向其他东西,除非它是一个参数。您可以将其视为 const 变量。你不能改变它的价值。 你可以这样做:

    double * arr [2] ;
    

    然后你调用 malloc .... 如果不想给它任何大小,那么您可以使用指向双精度指针的指针。如下:

    double ** arr;
    

    然后像这样调用 malloc

    arr = (double **) malloc(sizeof(double *) * max);
    

    所以这里你有一个没有指向任何东西的 arr 指针,如果你想让他们这样做,你应该为每个指针分配内存,如下所示:

    for (int i = 0; i < max; i++){
       arr[i] = malloc(sizeof(double) * 2);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多