Uma explicação detalhada de um dos motivos do loop infinito causado pelo array fora dos limites na linguagem C

Vamos dar uma olhada neste código primeiro (ambiente de desenvolvimento 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;
}

Você consegue adivinhar qual é a saída final no ambiente de desenvolvimento do VS, está gerando 13 hellos ou um erro de compilação ou outra coisa? Esqueça, a resposta é revelada, é um loop infinito e incontáveis ​​olás são emitidos. Por que isso está acontecendo, deixe-me explicar em detalhes a seguir~

Através da depuração, podemos descobrir que o valor de arr[12] é sempre o mesmo que o valor de i, o que significa que quando arr[12] mudar, eu também mudará e vice-versa:

 

 Vendo isso, podemos adivinhar se os endereços dos dois são os mesmos, caso contrário, por que você me mudaria? Ao olhar para os endereços dos dois, descobri que eles são realmente os mesmos!

? ? ? porque? ? ?

 Antes de falar, devemos primeiro saber que neste programa, os arrays i e arr são variáveis ​​locais, e as variáveis ​​locais são armazenadas na área da pilha.

O uso da pilha é alocar primeiro o espaço no endereço alto e depois alocar o espaço no endereço baixo de acordo com a ordem em que as variáveis ​​são definidas no código, e o endereço do array aumenta gradualmente com o aumento de o subscrito. A figura a seguir pode simplesmente representar o que foi dito acima:

 Conforme mostrado na figura, se o espaço entre i e o array arr for adequado, é possível que o array arr utilizado possa acessar i para trás, fazendo com que o valor de i seja alterado quando um determinado valor no array arr for alterado, o que é muito fácil causar um loop infinito.

Por fim, gostaria de acrescentar que o resultado de execução do código acima é estritamente dependente do ambiente do ambiente de compilação, e o resultado final também pode ser diferente. Por exemplo, no VC6.0, i e arr são contínuos e não há espaço entre eles. Existe um espaço entre i e arr no gcc. No VS2010, 2013, 2019, etc., existem 2 espaços entre i e arr, que é o caso acima. Então, para evitar todos os tipos de situações imprevisíveis, é melhor você prestar atenção ao escrever programas, não deixe o array acessar fora dos limites~~

Acho que você gosta

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