fugir sobre como verificar o tamanho de alocação da pilha

Sabemos que algumas variáveis ​​locais são armazenadas por meio da pilha. Mas no armazenamento real, quanto espaço damos a cada armazenamento de dados? Pegue os dados inteiros como exemplo desta vez para mostrar como verificar a alocação da pilha.

#include <stdio.h>
#include <stdlib.h>

int recurse(int x) {
    int a[1<<15];         /* 4 * 2^15 =  64 KiB */
    printf("x = %d.  a at %p\n", x, a);  /*"%d"代表输出十进制数值,"%p"表示输出地址*/
    a[0] = (1<<14)-1;
    a[a[0]] = x-1;
    if (a[a[0]] == 0)
    return -1;
    return recurse(a[a[0]]) - 1;/*递归调用,看最后至多可以分配多少个数的空间大小
}

Aqui, o limite de armazenamento é verificado chamando continuamente a função recursivamente.

int main(int argc, char *argv[]) {
    int x = 100;
    if (argc > 1)
 x = atoi(argv[1]);
    int v = recurse(x);
    printf("x = %d.  recurse(x) = %d\n", x, v);
    return 0;
}

Vamos dar uma olhada no resultado do cálculo:
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
podemos ver que não há 37 depois de x = 38, mas o núcleo da realidade mudou. Isso ocorre porque no processo de recursão contínua, o espaço de armazenamento que usamos continua a se expandir, e o espaço de armazenamento interno do computador é limitado, e o aumento contínuo fará com que os dados subsequentes sobrescrevam os dados anteriores, de modo que o programa não consiga encontrar o "caminho de volta" .

Vamos dar uma olhada nos resultados da execução com parâmetros: Insira a descrição da imagem aqui
quando o parâmetro é 20, ele não mostra que o núcleo foi transferido.

Acho que você gosta

Origin blog.csdn.net/xiongdan626/article/details/90613579
Recomendado
Clasificación