c arrays variable-length-array

Impresión de matriz bidimensional variable "subíndice de puntero a tipo incompleto" cuando se accede



arrays variable-length-array (3)

Estoy declarando una matriz bidimensional como tal:

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

Ahora imprimo en depurador;

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

¡¡Increíble!! No hay problema.

Ahora estoy declarando una matriz bidimensional como tal:

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

Ahora imprimo en depurador;

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

¿¿Por qué??


Así que dbush tiene razón. Pero he aquí por qué en un poco más de profundidad.

char arr[10][10];

no es lo mismo que

char arr[row][col];

Aunque se vean y actúen de manera similar.

En el estándar C89, el segundo sería ilegal ya que el compilador no tiene idea de cuánto espacio asignar para la variable (a pesar de que está definido en las dos líneas anteriores).

Ingrese el estándar C99 e introdujeron algo llamado arrays de longitud variable. La asignación de espacio para la matriz se determina en tiempo de ejecución en lugar de en tiempo de compilación . Ahora puede pasar un par de variables a una función y declarar una matriz con un tamaño basado en esas variables. ¡Hurra!

Pero significa que el compilador oficialmente no sabe detalles sobre la matriz. Como lo grande que es. Y LLDB usa el compilador Clang / LLVM para dar sentido al código.

Es un ejemplo de que el lenguaje se está convirtiendo en un nivel ligeramente superior y abstrae el trabajo que realiza debajo del capó. Y de vez en cuando eso te muerde por el culo.


El depurador no sabe exactamente qué tan grande es la matriz, por lo que necesita aplicar una conversión:

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


hacer la col y la row const

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