ошибка: неверное использование массива с неопределенными границами - решение включено, требуется уточнение - PullRequest
1 голос
/ 23 декабря 2019
#include <stdio.h>
#include <malloc.h>
#define NUM_ROWS 5
#define NUM_COLS 10

void dynamic_allocation_malloc3();

int main() { 
   dynamic_allocation_malloc3();
}

void dynamic_allocation_malloc3() {

    int (**ptr)[]; //ptr is a pointer to a pointer to a 1-d integer array
    ptr = malloc(NUM_ROWS * sizeof(int(*)[])); // allocate as many as NUM_ROWS pointers to 1-d int arrays. The memory holds pointers to rows 

    for(int row=0; row < NUM_ROWS; row++) {

       ptr[row] = malloc(NUM_COLS * sizeof(int)); 

       for(int col=0; col < NUM_COLS; col++) {
            ptr[row][col] = 17;
      }
    }
}

Этот код выдает следующую ошибку при компиляции:

$ gcc -std=c99 dynamic_allocation_scratch.c 
dynamic_allocation_scratch.c: In function ‘dynamic_allocation_malloc3’:
dynamic_allocation_scratch.c:23:13: error: invalid use of array with unspecified bounds
             ptr[row][col] = 17;
             ^
dynamic_allocation_scratch.c:23:13: error: invalid use of array with unspecified bounds

Исправление должно заменить

ptr[row][col] = 17;

на

(*ptr[row])[col] = 17; //de-reference the pointer to 1-d array to get the array and then use col index 

Вопрос:

Я хочу уточнить мое понимание здесь. Правильно ли я объяснил, почему исправление работает? Любые дальнейшие разъяснения, почему оригинальный код не работал, также будут оценены.

Ответы [ 2 ]

1 голос
/ 23 декабря 2019

ptr[row] имеет тип указатель на массив int с неизвестной границей . Таким образом, ptr[row][col] будет означать «col -й массив из int с неизвестной границей», который не может быть вычислен, так как мы не знаем размер каждого массива, чтобы найти следующий массив в памяти.

Первый из них, *(ptr[row]), действителен, поскольку в нем не используется никакой арифметики. Это выражение имеет тип массив int с неизвестной границей , и вы можете использовать оператор [col] для такого массива.

1 голос
/ 23 декабря 2019

Вам нужно решить, сколько уровней косвенности вы хотите. Указатель на указатель на массив состоит из трех уровней, но

ptr[row][col]

- это только два уровня. Давайте посмотрим

ptr    // a pointer to a pointer to an array
ptr[row]     // a pointer to an array
ptr[row][col] // an array
ptr[row][col] = 17 // an array equals 17; explain that to your nearest rubber duck
...