如何解决堆栈损坏的错误?

时间:2019-01-04 09:36:56

标签: c stack dynamic-memory-allocation stack-corruption

void aloca(automob **autos, int n)
{

    *autos = (automob*)malloc(sizeof(automob));
    for (int i = 0; i < n; i++) {
        autos[i] = (automob*)malloc(sizeof(automob));
    }
}

void read_autos(char* filename, automob **A, int *n)
{ 
    FILE *f_in = fopen(filename, "r");
    int i = 0, aux;
    if (f_in == NULL) {
        printf("Nu s-a gasit fisierul!");
        _getch();
        exit(0);
    }
    fscanf(f_in, "%d", n);
    aloca(A, *n);
    while (i < (*n)) {
        fscanf(f_in, "%d", &(*A)[i].locuri);
        fscanf(f_in, "%d", &(*A)[i].putere);
        fscanf(f_in, "%s", (*A)[i].marca);
        fscanf(f_in, "%s", (*A)[i].culoare);
        fscanf(f_in, "%d", &(*A)[i].an_fabricatie);
        i++;
    }
}

void main()
{
    int n;
    automob *A;
    read_autos("autos.in", &A, &n);
    _getch();
}

我在A周围堆栈损坏。如何解决此问题?我认为这与分配有关,但我不知道如何解决。我真的看不到解决方案。

2 个答案:

答案 0 :(得分:1)

automob *A;声明意味着您有一个指向栈中声明的automob的指针,而&A是指向栈中该位置的指针,这就是您最终传递给{{ 1}}功能。

aloca

分配一个*autos = (automob*)malloc(sizeof(automob));并将该指针分配给automob,这很好。

现在

A

是问题。 for (int i = 0; i < n; i++) { autos[i] = (automob*)malloc(sizeof(automob)); } 等同于autos[i]*(autos + i)是指向堆栈的指针(这是您传递给函数的指针),堆栈上该位置的大小为autos。使用此代码,您尝试将在堆栈上所做的所有分配存储在sizeof(automob *)附近(在&A中声明),最终您将覆盖堆栈保护(运行时使用它来保持堆栈完整性) )。要分配n个main,您只需要这样做:

automob

,您有*autos = (automob*)malloc(sizeof(automob) * n);个数组,您可以像这样访问它:

automob中:aloca是第*autos[i]

automob中:read_autos是第i个元素,

并且在*A[i]中:main是第i个元素。

答案 1 :(得分:0)

void aloca(automob **autos, int n)
{

    *autos = malloc(n * sizeof(automob));
}

以此类推

您需要检查错误条件,例如失败的malloc或scanf