2011-09-15 12 views
9

En Visual Studio 2010, esta inicialización funciona como se espera:¿Por qué no puedo omitir las dimensiones por completo al inicializar una matriz multidimensional?

char table[2][2] = { 
         {'a', 'b'}, 
         {'c', 'd'} 
        }; 

Pero no parece legal para escribir algo como:

char table[][] = { 
        {'a', 'b'}, 
        {'c', 'd'} 
       }; 

Visual Studio se queja de que esta matriz no puede contener elementos de " ese 'tipo, y después de compilar, VS informa dos errores: un índice que falta y demasiadas inicializaciones.

PREGUNTA: ¿Por qué no puedo omitir las dimensiones por completo al inicializar una matriz multidimensional?

Respuesta

12

Solo se puede omitir la dimensión más interna. El tamaño de los elementos en una matriz se deduce para el tipo dado a la variable de matriz. El tipo de elementos debe, por lo tanto, tener un tamaño conocido.

  • char a[]; tiene elementos (por ejemplo a[0]) de tamaño 1 (8 bits), y tiene un tamaño desconocido.
  • char a[6]; tiene elementos de tamaño 1, y tiene tamaño 6.
  • char a[][6]; tiene elementos (por ejemplo a[0], que es una matriz) de tamaño 6, y tiene un tamaño desconocido.
  • char a[10][6]; tiene elementos de tamaño 6. y tiene tamaño 60.

No permitido:

  • char a[10][]; tendría 10 elementos de tamaño desconocido.
  • char a[][]; tendría un número desconocido de elementos de tamaño desconocido.

El tamaño de los elementos es obligatorio, el compilador necesita acceder a los elementos (a través de la aritmética del puntero).

+6

En otras palabras, aunque el tamaño de la matriz en sí puede ser desconocido, ¿no se puede conocer el tamaño de los elementos? –

+0

@Miroslav: ¡Exactamente! –

+0

Ah, bueno, gracias por este poco de información. Después de pensarlo más, parece lógico, como siempre ocurre, ¿no es así? ;-) –

0

¿Es esto una solución aceptable?

char * table [] = { "ab", "cd" }; 

EDITAR: Tenga en cuenta que agregará un '0' adicional al final de cada cadena.

+0

Esa es una buena solución. Pero no la respuesta que estaba buscando. Aún así, gracias por mostrarme un truco genial. :-) –

Cuestiones relacionadas