C: объявить многомерные массивы без размера? - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь объявить длинный 2-мерный массив, например, таким образом, чтобы позже я мог скопировать длинный массив в небольшой массив правильного размера:

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

, чтобы позже я мог использовать:

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

, а затем скопируйте все элементы. (Я заполняю длинный массив простым циклом for) Но мой компилятор выдает сообщение об ошибке, говоря «тип массива имеет неполный тип элемента» в объявлении. Нет ли способа объявить многомерный массив без указания его размера?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Вы пытаетесь изменить значение arr (где это указывает), это ошибка, потому что указатель этого типа не может быть переназначен на что-то другое, если он не был параметром. Вы можете думать об этом как о константной переменной. Что вы не можете изменить его значение. Вы можете сделать следующее:

double * arr [2] ;

И затем вы вызываете malloc .... и, если не хотите придавать ему какой-либо размер, вы можете использовать указатель на указатель на double. следующим образом:

double ** arr;

и затем вызвать malloc следующим образом:

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

, так что здесь у вас есть массив указателей, которые ни на что не указывают, если вы хотите, чтобы они это делали,Вы должны выделить память для каждого из них следующим образом:

for (int i = 0; i < max; i++){
   arr[i] = malloc(sizeof(double) * 2);
}
0 голосов
/ 10 ноября 2019

Нет ли способа объявить многомерный массив без указания его размера?

Вам необходимо знать все измерения, кроме «последнего» / самого «верхнего» измерения. Потому что для выделения памяти необходимо знать размер элемента в массиве. Что касается вашего случая, все просто - вы выделяете массив из двух двойных.

Вы можете сделать указатель на массив из двух двойных элементов:

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

Тип *arrdouble[2], поэтому sizeof(*arr) будет правильно определен как sizeof(double[2]).

...