Объявление
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-й элемент.