2016-01-22 11 views
19

Oświadczam dwuwymiarową tablicę jako takie:zmiennej dwuwymiarowej tablicy drukowania „indeks o wskaźnik do niepełnej typu” kiedy obejrzano

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

Teraz drukować debugger;

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

Niesamowite !! Nie ma problemu.

Teraz jestem deklarowania dwuwymiarowej tablicy jako takie:

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

Teraz drukować debugger;

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

Dlaczego ??

+1

Przypuszczam, że ani DWARF, ani gdb nie obsługują tablic o zmiennej długości. – fuz

+2

'podwójna tablica jako taka:' oznacza? –

+3

@SouravGhosh "Dwuwymiarowa tablica jak ta:" była moją interpretacją. Dość mylące od "double" sprawia, że ​​myślisz o floats. – unwind

Odpowiedz

17

Debuger nie dokładnie, jak duża tablica jest wiedzieć, więc trzeba zastosować Obsada:

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

Gdyby to było 'arr [10] [3]' musiałby to być 'p ((char (*) [3]) arr) [0] [0] '? – sodiumnitrate

+0

przy użyciu azotanu sodu Prawidłowo. Obsada musi pasować do typu. – dbush

+0

Dzięki!Czy mógłbyś wyjaśnić, dlaczego to nie jest '((char (*) [10] arr) [0] [0]'? – sodiumnitrate

2

podjęciu const col i row

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

+0

To jest pytanie w języku C. W C czyniąc je' const' nie stworzy Różnica W języku C 'const' na' col' i 'row' nie zapobiegnie przekształceniu tablicy w VLA i nie będzie miało wpływu na oryginalny problem. – AnT

13

Więc dbush IS dobrze. Ale oto dlaczego w nieco większej głębi.

char arr[10][10]; 

nie jest to samo, co

char arr[row][col]; 

Chociaż wyglądają i działają podobnie.

W standardzie C89 drugi byłby niezgodny z prawem, ponieważ kompilator nie ma pojęcia, ile miejsca należy przydzielić dla zmiennej (mimo że zdefiniowano ją w dwóch poprzednich wierszach).

Wprowadź standard C99 i wprowadzono coś, co nazywa się tablicami o zmiennej długości. Przydział miejsca dla macierzy jest ustalany jako w środowisku wykonawczym a następnie podczas kompilacji. Teraz możesz przekazać kilka zmiennych do funkcji i zadeklarować tablicę o rozmiarze opartym na tych zmiennych. Yay!

Ale to oznacza, że ​​kompilator oficjalnie nie zna szczegółów na temat tablicy. Jak to jest duże. LLDB używa kompilatora Clang/LLVM, aby zrozumieć kod.

Jest to przykład, w którym język staje się nieco wyższy, a praca jest wykonywana pod maską. A czasami gryzie cię w dupę.

Powiązane problemy