Una explicación detallada de una de las razones del bucle infinito causado por la matriz fuera de los límites en el lenguaje C

Primero echemos un vistazo a este código (entorno de desarrollo VS):

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    for (i = 0; i <= 12; i++)
    {
        arr[i] = 0;
        printf("hello\n");
    }
    return 0;
}

¿Puedes adivinar cuál es el resultado final en el entorno de desarrollo de VS, está generando 13 saludos o un error de compilación u otra cosa? Olvídalo, se revela la respuesta, es un bucle infinito y se emiten innumerables saludos. ¿Por qué sucede esto? Déjame explicarlo en detalle a continuación~

A través de la depuración, podemos encontrar que el valor de arr[12] es siempre el mismo que el valor de i, lo que significa que cuando arr[12] cambia, i también cambiará, y viceversa:

 

 Al ver esto, también podríamos adivinar si las direcciones de los dos son las mismas, de lo contrario, ¿por qué me cambiarías? Al mirar las direcciones de los dos, ¡descubrí que son realmente iguales!

? ? ? ¿por qué? ? ?

 Antes de hablar, primero debemos saber que en este programa, las matrices i y arr son variables locales, y las variables locales se almacenan en el área de la pila.

El uso de la pila es asignar primero el espacio en la dirección alta y luego asignar el espacio en la dirección baja de acuerdo con el orden en que se definen las variables en el código, y la dirección de la matriz aumenta gradualmente con el aumento de el subíndice. La siguiente figura puede representar simplemente lo dicho anteriormente:

 Como se muestra en la figura, si el espacio entre i y el arreglo arr es adecuado, es posible que el arreglo arr utilizado pueda acceder a i hacia atrás, lo que hace que el valor de i cambie cuando cambia cierto valor en el arreglo arr, lo que es muy fácil causar un bucle infinito.

Finalmente, me gustaría agregar que el resultado de ejecución del código anterior depende estrictamente del entorno del entorno de compilación, y el resultado final también puede ser diferente. Por ejemplo, en VC6.0, i y arr son continuos y no hay espacio entre ellos. Hay un espacio entre i y arr en gcc. En VS2010, 2013, 2019, etc., hay 2 espacios entre i y arr, que es el caso anterior. Entonces, para evitar todo tipo de situaciones impredecibles, es mejor que prestes atención al escribir programas, no permitas que el arreglo se salga de los límites~~

Supongo que te gusta

Origin blog.csdn.net/m0_63039919/article/details/121479389
Recomendado
Clasificación