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周围的堆栈损坏了。我如何解决这个问题?我想是分配问题,但我不知道怎么解决。我真的看不出解决办法。

最佳答案

automob *A;声明意味着您有一个指向堆栈上声明的automob的指针,而&A是指向堆栈上该位置的指针,这就是您最后传递给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附近(在main中声明)的堆栈上所做的所有分配,并最终覆盖堆栈保护(运行时用于保持堆栈完整性)。要分配nautomobs,您只需要:
*autos = (automob*)malloc(sizeof(automob) * n);
你有一个automobs数组,你可以这样访问它:
aloca中:*autos[i]是第i个automob
read_autos中:*A[i]是第i个元素,
main中:A[i]是第i个元素。

关于c - 如何解决堆栈损坏的错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54036303/

10-11 22:06