2016-01-22 16 views
19

sto Dichiarazione di una matrice bidimensionale in quanto tale:variabile matrice bidimensionale di stampa "Indice di puntatore a tipo incompleto" quando si accede

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

Ora posso stampare in debugger;

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

Fantastico !! Nessun problema.

Ora sto Dichiarazione di una matrice bidimensionale in quanto tale:

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

Ora posso stampare in debugger;

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

Perché ??

+1

Suppongo che né DWARF né gdb supportino matrici di lunghezza variabile. – fuz

+2

'doppio array in quanto tale:' significa? –

+3

@SouravGhosh "Un array bidimensionale come questo:" è stata la mia interpretazione. Abbastanza confusionario poiché 'double' ti fa pensare ai float. – unwind

risposta

17

Il debugger non sa esattamente quanto è grande l'array è, quindi è necessario applicare un cast:

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

Se fosse stato 'arr [10] [3] 'sarebbe stato necessario' p ((char (*) [3]) arr) [0] [0] '? – sodiumnitrate

+0

@sodiumnitrate corretto. Il cast deve corrispondere al tipo. – dbush

+0

Grazie!Potresti spiegare perché non è '((char (*) [10] arr) [0] [0]'? – sodiumnitrate

2

rendono il col e row const

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

+0

Questa è una domanda in linguaggio C. In C, renderli 'const' non farà un differenza nel linguaggio C 'const' su' col' e 'row' non impedirà all'array di diventare VLA e quindi non avrà alcun effetto del problema originale. – AnT

13

Così dbush è destra. Ma ecco perché in un po 'più di profondità.

char arr[10][10]; 

non è la stessa cosa di

char arr[row][col]; 

Anche se sembrano e si comportano simili.

Nello standard C89, il secondo sarebbe illegale poiché il compilatore non ha idea di quanto spazio allocare per la variabile (anche se è definito nelle due righe precedenti).

Immettere lo standard C99 e hanno introdotto qualcosa chiamato matrici di lunghezza variabile. L'allocazione dello spazio per l'array è determinata in fase di esecuzione anziché in in fase di compilazione. Ora puoi passare un paio di variabili a una funzione e dichiarare una matrice con una dimensione basata su quelle variabili. Sìì!

Ma significa che il compilatore non conosce ufficialmente i dettagli dell'array. Come quanto è grande. E LLDB usa il compilatore Clang/LLVM per dare un senso al codice.

È un esempio del linguaggio che diventa leggermente più alto livello e che astragga il lavoro che fa sotto il cofano. E ogni tanto ti morde il culo.

Problemi correlati