C - 结构数组上的 free()



我在使用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(),它允许您指定缓冲区大小。

相关内容

  • 没有找到相关文章

最新更新