我在使用malloc的第一个程序时遇到问题。我的问题是程序在执行 free() 行时崩溃。我不知道为什么会发生这种情况,并想知道如何防止它发生。
#include <stdio.h>
#include <stdlib.h>
struct product{
int cost;
char thing[20];
};
int main()
{
int amount;
scanf("%d", &amount);
getchar();
struct product *products;
products = (struct product *) malloc(amount);
for (int i = 0; i < amount; i++)
{
printf("Thing of %d ", (i + 1));
gets(products[i].thing);
printf("Cost of %d: ", (i + 1));
scanf("%d", &products[i].cost);
getchar();
}
free(products);
return 0;
}
您没有分配足够的内存。 它应该是:
products = (struct product *) malloc(amount * sizeof(struct product));
(malloc casting从原始代码中留下,我不参加辩论。
实际上你malloc()
,amount
内存并使用amount * sizeof(struct product)
。它可能工作正常,但是当您调用free()
时,它会导致崩溃,因为您已经写入了一些未分配的内存,并且free()
尝试释放实际上没有为您分配的内存。
products = malloc(amount * sizeof(struct product)); // No casting too
无需强制转换 malloc()
返回的值,因为它是从指向 someOther*
的指针void*
隐式转换的。
除了没有用 malloc() 分配足够的内存之外,函数 gets() 是不安全的,已弃用的,因此永远不应该使用。
如果在任何时候使用输入的字符数超过缓冲区的可用字符数,则会出现未定义的行为。将其替换为 fgets(),它允许您指定缓冲区大小。