Подтвердить что ты не робот

Переменная двумерная печать массива "индекс указателя на неполный тип" при доступе

Я объявляю двухмерный массив как таковой:

char arr[10][10];
arr[0][0] = 'X';

Теперь я печатаю в отладчике;

(lldb) po arr[0][0]
'X'

Удивительный!! Нет проблем.

Теперь я объявляю двухмерный массив как таковой:

int col = 10;
int row = 10;
char arr[row][col];
arr[0][0] = 'X';

Теперь я печатаю в отладчике;

(lldb) po arr[0][0]
error: subscript of pointer to incomplete type 'char []'
error: 1 errors parsing expression

Почему??

4b9b3361

Ответ 1

Отладчик не знает точно, насколько велик массив, поэтому вам нужно применить бросок:

(gdb) p ((char (*)[10])arr)[0][0]
$2 = 88 'X'

Ответ 2

Так что дбуш прав. Но вот почему чуть глубже.

char arr[10][10];

- это не то же самое, что

char arr[row][col];

Даже если они выглядят и действуют одинаково.

В стандарте C89 второй будет незаконным, поскольку компилятор не знает, сколько места выделяется для переменной (даже если это определено в двух предыдущих строках).

Введите стандарт C99, и они представили что-то, называемое массивами переменной длины. Распределение пространства для массива определяется во время выполнения, а не во время компиляции. Теперь вы можете передать несколько переменных функции и объявить массив с размером, основанным на этих переменных. Ура!

Но это означает, что компилятор официально не знает подробностей о массиве. Как он большой. И LLDB использует компилятор Clang/LLVM, чтобы понять код.

Это пример того, как язык становится чуть более высоким и абстрагирует работу, выполняемую под капотом. И иногда это тебя укусы в задницу.

Ответ 3

сделайте col и row const

const int col = 10; const int row = 10;