Как я могу решить ошибку стека? - PullRequest
0 голосов
/ 04 января 2019
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 голосов
/ 04 января 2019
Объявление

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), и в конечном итоге вы перезапишите защиту стека (которая используется средой выполнения для сохранения целостности стека).Чтобы выделить n automob s, вам нужно только это:

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

, и у вас есть массив automob s, и вы можете получить к нему доступ следующим образом:

в aloca: *autos[i] - это i'th automob,

в read_autos: *A[i] - это i-й элемент,

и в main: A[i] - это i-й элемент.

0 голосов
/ 04 января 2019
void aloca(automob **autos, int n)
{

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

и т. Д.

вам нужно проверить наличие ошибок, таких как сбой malloc или scanf

...