2012-04-20 17 views
8

¿Hay una matriz con 0 elementos igual a un puntero sin asignar?Matrices con 0 elementos

¿Es int arr[0]; lo mismo que int* arr;?

Editar: ¿Qué pasa si hice algo similar a esto:

int x[0]; 
int* const arr = x; 

Probé este código y compilado. Que yo sepa, tanto x como arr deberían estar apuntando a la misma ubicación en la memoria. ¿Cuál sería la diferencia en este caso?

+1

Un puntero siempre puede señalar algo nuevo, mientras que una matriz está estáticamente definida. – chrisaycock

Respuesta

13

No, en absoluto.

En el caso de arr [0], arr tiene una dirección bien definida.

En el caso de * arr, arr simplemente no está inicializado.

Después de su EDITAR, donde inicializar la const arr con una serie definida justo antes: no sería más que no hay diferencia en el contenido de las variables, pero en las acciones que se le permitiría llevar a cabo en ellos .

+0

¿Qué pasa con int * const arr? – Dasaru

+0

@Dasaru ¿Lo has intentado? Eso no compila ... –

+0

@Dasaru: normalmente podrías ... pero tendrías que inicializar manualmente el ** arr ** en una ubicación de memoria dada, ya que es const. Eche un vistazo a http://stackoverflow.com/questions/355258/why-must-const-members-be-intialized-in-the-constructor-initializer-rather-than –

0

Una matriz de longitud cero apunta a una dirección específica, el comienzo de la matriz. Después del final de la matriz, tendrá datos no definidos, en este caso, en la dirección indicada.

int arr[0]; 
int* ptr; 

// arr is a reliable value; 
// *arr is not; 
// ptr is not; 

Una manera esto es útil: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Zero-Length.html

+0

Hasta donde yo sé, todavía no hay consenso sobre si este uso es realmente legal de acuerdo con el estándar, ya que el acceso de matriz fuera de los límites es simplemente UB (y * no * causa errores en el software, esto no es meramente hipotético). –

+0

@KonradRudolph En C90, no había duda: 'int arr [0]' era ilegal, incluso en una estructura. Y estaba claro que si el arreglo se declaraba 'int arr [1];', y se accedía con el índice 2, era un comportamiento indefinido. C99 (pero no C++), puede declarar el miembro final de una estructura como 'int arr [];' para admitir este uso (pero 'int arr [0];' sigue siendo un error). –

+0

@James Ah, eso fue todo. ¿Y qué hay de C++? Estoy bastante seguro de que el acceso al conjunto fuera de límites nunca fue legal, ¿estoy en lo cierto? –

4

A declarado localmente matriz de longitud cero es ilegal en C++ así que no es lo mismo que un puntero no asignado.

Cuestiones relacionadas