2012-05-25 30 views
14

Duplicar posible:
May I treat a 2D array as a contiguous 1D array?¿Es legal acceder a una matriz bidimensional como si fuera unidimensional?

Considere el siguiente código:

int array2d[10][10]; 
int *array1d = array2d[0]; 

Nunca oí hablar de una implementación en la que no funcionaría, pero es legal acceder y manipular array2d a través de array1d? ¿Qué sección del estándar permite esto? ¿Existe algo en el estándar que impida que las implementaciones inserten espacio extra o relleno entre cada una de las matrices de segundo nivel (no es necesario, pero sí lo es)?

Pregunta extra: ¿Hay alguna manera de acceder a array2d como int[100] que no requiere reinterpret_cast o C-style?

+0

Siempre puede envolverlo en una clase que lo almacene internamente como una matriz unidimensional. – chris

+3

¿Firmado para el concurso ofuscado C++ :)? – ScarletAmaranth

+1

¿No es 'int * array1d = array2d [0];' un poco más directo? – ildjarn

Respuesta

5

Si la memoria sirve, el estándar da esto como un ejemplo de algo que es un comportamiento oficialmente indefinido, pero esencialmente siempre funciona. [Editar: Esto es lo que estaba pensando: C99, §J.2 (comportamiento no definido):

  • Un subíndice de matriz está fuera de rango, incluso si un objeto es aparentemente accesible con la subíndice dado (como en la expresión de un valor-i [1] [7] dada la declaración int una [4] [5])

no estoy totalmente seguro que se aplica sin embargo, como que está recibiendo la dirección del comienzo de una matriz y convertirla en un simple puntero a la ONU de tipo derivado.]

Las matrices deben ser contiguas, por lo que no pueden insertar ningún relleno entre los elementos de una matriz. Eso es cierto si tiene una matriz de int o una matriz de matrices.

0

Esto es de hecho legal. La norma establece claramente que las matrices multidimensionales son simplemente matrices 1D más grandes. No tengo la cita exacta, pero sé que es verdad.

+0

Recientemente desenterré la standardese en el diseño de matriz 2D (respuesta [aquí] (http://stackoverflow.com/questions/10618473/is-this-c-code-portable-assuming-multidimensional-arrays-have-continuous-mem/10618866 # 10618866)). No estoy seguro de si la parte que dice que una matriz 'T [n]' toma * exactamente * 'n * sizeof (T)' es así. – Jon

+0

Básicamente, el "contiene" en la primera cita me pone un poco nervioso. ¿Por qué no una redacción más fuerte? "Contiene" solo da un límite inferior. – Jon

+2

@Jon C++ 2003, §5.3.3/2: 'sizeof': cuando se aplica a una matriz, el resultado es el número total de bytes en la matriz. Esto implica que el tamaño de una matriz de n elementos es n veces el tamaño de un elemento. –

Cuestiones relacionadas