Ответ 1
Отладчик не знает точно, насколько велик массив, поэтому вам нужно применить бросок:
(gdb) p ((char (*)[10])arr)[0][0]
$2 = 88 'X'
Я объявляю двухмерный массив как таковой:
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
Почему??
Отладчик не знает точно, насколько велик массив, поэтому вам нужно применить бросок:
(gdb) p ((char (*)[10])arr)[0][0]
$2 = 88 'X'
Так что дбуш прав. Но вот почему чуть глубже.
char arr[10][10];
- это не то же самое, что
char arr[row][col];
Даже если они выглядят и действуют одинаково.
В стандарте C89 второй будет незаконным, поскольку компилятор не знает, сколько места выделяется для переменной (даже если это определено в двух предыдущих строках).
Введите стандарт C99, и они представили что-то, называемое массивами переменной длины. Распределение пространства для массива определяется во время выполнения, а не во время компиляции. Теперь вы можете передать несколько переменных функции и объявить массив с размером, основанным на этих переменных. Ура!
Но это означает, что компилятор официально не знает подробностей о массиве. Как он большой. И LLDB использует компилятор Clang/LLVM, чтобы понять код.
Это пример того, как язык становится чуть более высоким и абстрагирует работу, выполняемую под капотом. И иногда это тебя укусы в задницу.
сделайте col
и row
const
const int col = 10;
const int row = 10;