Pregunta

Lo siento si esto es una cuestión novato :(.

Pedazo de código C.

int array[5];
int cnt;

for(cnt = 0; cnt <= 10; cnt+=1)
{
      array[cnt] = cnt;
}

debe dar un error, ¿verdad? ¡No! ¡Funciona bien! Pero ¿por qué? Parece que -en la primera línea- una matriz de más que el tamaño doble (11) está definido. Incluso puede acceder array [5 a 10] más adelante. Y eso me es confusa. Se deja de funcionar cuando se define array [4 o menos] ...

Gracias de antemano.

¿Fue útil?

Solución

Puede suceder que trabajar con su compilador y equipo en particular, pero no se debe contar con ello.

El comportamiento de su código de acuerdo con la especificación del lenguaje C es Indefinido . Esto significa que puede hacer lo que se espera, o puede hacer que el equipo se bloquee, o podría causar demonios, para volar en la nariz .

A diferencia de lenguajes de alto nivel como Java y C #, C confía en ti y no realiza comprobaciones explícitas de los límites de las matrices. Se supone que para ser responsable y no pisar fuera de los límites de la matriz.

Otros consejos

Esto sólo "funciona" si su definición de "obras" es sinónimo de "no ha desplomado aún".

Lo que está viendo es comportamiento indefinido , motivo de su acceso la matriz con un índice válido. un comportamiento indefinido significa que cualquier cosa podría suceder, incluyendo su programa que aparece a trabajar correctamente.

"Pero ¿por qué es eso?"

Debido a que esa es la forma C es.

Los límites de matriz no se comprueban en tiempo de ejecución.

Esa es la "Ley de la C"

A mí me gusta señalar que todo esto es de hecho indefinido. Su ejemplo "funciona" en este ejemplo específico, porque ambas variables se encuentran en la pila. Esa es la dirección de la CNT es justo por debajo del final de la matriz. Cuando cnt alcanza cnt == 5 la matriz declaración [cnt] = cnt; no escribe en la memoria dedicada a la matriz, pero sólo después de que, cuando la dirección del CNT yacía. Es cuestión de suerte que no altera su contador. Cuando cnt> 5 no hay memoria a la basura y que sólo se va a escribir en el "vacío de pila" (no sé la palabra adecuada).

otro ejemplo para ilustrar esto:

int main(int ac,char **av)
{
    int a[5];
    int cnt;
    int cnt2=3;

    for(cnt=0;cnt<7;cnt++) {
        a[cnt]=cnt;
        printf("%d %d %d\n", a[cnt], cnt, cnt2);
    }
}

salida:

0 0 3
1 1 3
2 2 3
3 3 3
4 4 3
5 5 5
6 6 5

Las dos últimas escrituras del bucle sobrescribe los datos pila después de a [] y pueden producir errores muy confuso. En este caso está destrozada el CNT2.

matrices en C no se comprueban en tiempo de ejecución. En otras palabras, se puede "definir" una matriz de tamaño N y felizmente acceder fuera de la final de la matriz ligada. Si te sales de la final de la matriz, entonces la basura de memoria en algún lugar de la pila (o el montón).

Una vez que la basura de memoria en algún lugar, su programa es probable que fallen. Estos accidentes pueden ser difíciles de localizar, ya que podría chocar lejos de donde realmente se sobrepasó el final de la matriz.

Por lo general cuando se declara matrices en C, lo mejor es utilizar algún tipo de constante o #define para marcar el tamaño de la matriz:

#define MAX_ELEMENTS 10
int array[MAX_ELEMENTS];
int cnt;
for(cnt = 0; cnt < MAX_ELEMENTS; cnt+=1) {
   array[cnt] = cnt;
}

Si se pasa de max_elements en la asignación de matrices, que podría sobrescribir el valor de CNT. Es posible sobrescribir alguna otra variable. Todo depende del compilador y la estructura del código. También tenga en cuenta el uso de la

límites de matriz en C son no necesariamente comprueba en tiempo de ejecución. La norma deja ejecutores libre de hacerlo si así lo desean, o no - eso es parte de lo que es Indefinido . En una implementación con los punteros de grasa de la muestra de hecho podría causar algún tipo de error.

Una vez que se ejecuta fuera de la final de la serie, va a sobrescribir la memoria que el software no está a la espera y la corrupción de la pila. Usted software puede continuar funcionando, pero será muy inestable!

Depende de cómo se embala la memoria de pila. Además, las escribe esos valores e incluso leerlos, pero lo más probable es que la corrupción de la pila.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top