如何解决堆栈损坏错误?
How can I solve the stack corrupted error?
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 周围出现堆栈损坏。我该如何解决这个问题?我认为这与分配有关,但我不知道如何解决。实在是看不出解决方法。
void aloca(automob **autos, int n)
{
*autos = malloc(n * sizeof(automob));
}
等等
您需要检查 malloc 或 scanf 失败等错误情况
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
的数组,您可以像这样访问它:
in aloca
: *autos[i]
是第 i 个 automob
,
在read_autos
中:*A[i]
是第i个元素,
并且在 main
中:A[i]
是第 i 个元素。
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 周围出现堆栈损坏。我该如何解决这个问题?我认为这与分配有关,但我不知道如何解决。实在是看不出解决方法。
void aloca(automob **autos, int n)
{
*autos = malloc(n * sizeof(automob));
}
等等
您需要检查 malloc 或 scanf 失败等错误情况
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
的数组,您可以像这样访问它:
in aloca
: *autos[i]
是第 i 个 automob
,
在read_autos
中:*A[i]
是第i个元素,
并且在 main
中:A[i]
是第 i 个元素。