有关使用realloc减小malloc大小的问题

ca1c2owp  于 2023-01-08  发布在  其他
关注(0)|答案(2)|浏览(115)

我试图减小malloc数组的大小,但是当我为malloc重新分配一个更小的大小时,它抛出了-1073741819(0xC 0000005)。

typedef struct {
    float reproduce_prob;
    int mature;
    int life;
    int age;
    char *direction;
    int X;
    int Y;
} slug;
slug *slugs = (slug *) malloc(sizeof(slug) * (slugCount + 1));
int slugCount = 0;
                        if (slugCheck(theGrid, frogs[i])) {
                            int pos = feedFrog(frogs[i], slugs, slugCount);
                            for (int z = pos; z < slugCount - 1; z++) {
                                slugs[z] = slugs[z + 1];
                            }
                            slugCount--;
                            slugs = realloc(slugs, sizeof(slugs) * (slugCount + 1));
                            frogs[i].initHung = 0;
                        }

slugCount不为零。

nom7f22z

nom7f22z1#

sizeof中使用对象而不是类型是一个很好的做法。另外,使用distinct和有意义的类型和变量名来避免这类错误也是很好的。我将其称为slugslugTypeslug_type
在这一行中,您没有分配足够的空间(假设slug结构比指针大),因为sizeof(slugs)给出了指向slug的指针的大小:

slugs = realloc(slugs, sizeof(slugs) * (slugCount + 1));

您还错误地使用了realloc,因为realloc可能会失败,并且会出现内存泄漏

slug *tmp;
tmp = realloc(slugs, sizeof(*tmp) * (slugCount + 1));
if(tmp)
{
    slugs = tmp;
}
else
{
    /* error handling */
}

作为旁注:不要强制转换malloc家族函数的结果。如果您的代码无法编译,则意味着您使用C编译器编译C语言代码。这不是一个好主意,因为C和C是不同的语言,即使语法看起来相似。

wr98u20j

wr98u20j2#

这段代码是如何编译的?

slug *slugs = (slug *) malloc(sizeof(slug) * (slugCount + 1));
int slugCount = 0;

编译器应该对您在定义slugCount * 之前使用它大吼大叫。
如果这段代码正在编译,这意味着你已经在一个封闭的作用域中定义了slugCount,并且它的值可能不是零。
您应该 * 总是 * 检查malloccallocrealloc的结果。您确定mallocrealloc调用都没有返回NULL吗?
这一行很可疑:

slugs = realloc(slugs, sizeof(slugs) * (slugCount + 1));

sizeof(slugs)给出的是指针的大小,而不是slug类型的大小--你并没有将数组扩展一个元素,而是将它缩小了一个很大的范围。

slug *tmp = realloc( slugs, sizeof *slugs * (slugCount + 1) );

您应该始终将realloc的结果赋给一个临时变量。如果realloc无法满足请求,它将返回NULL *,并保留原始缓冲区 *。但是,如果您将NULL结果赋回原始指针,您将丢失对该内存的唯一引用。

相关问题