我试图减小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不为零。
2条答案
按热度按时间nom7f22z1#
在
sizeof
中使用对象而不是类型是一个很好的做法。另外,使用distinct和有意义的类型和变量名来避免这类错误也是很好的。我将其称为slug
slugType
或slug_type
。在这一行中,您没有分配足够的空间(假设slug结构比指针大),因为sizeof(slugs)给出了指向
slug
的指针的大小:您还错误地使用了realloc,因为realloc可能会失败,并且会出现内存泄漏
作为旁注:不要强制转换
malloc
家族函数的结果。如果您的代码无法编译,则意味着您使用C编译器编译C语言代码。这不是一个好主意,因为C和C是不同的语言,即使语法看起来相似。wr98u20j2#
这段代码是如何编译的?
编译器应该对您在定义
slugCount
* 之前使用它大吼大叫。如果这段代码正在编译,这意味着你已经在一个封闭的作用域中定义了
slugCount
,并且它的值可能不是零。您应该 * 总是 * 检查
malloc
、calloc
和realloc
的结果。您确定malloc
和realloc
调用都没有返回NULL
吗?这一行很可疑:
sizeof(slugs)
给出的是指针的大小,而不是slug
类型的大小--你并没有将数组扩展一个元素,而是将它缩小了一个很大的范围。您应该始终将
realloc
的结果赋给一个临时变量。如果realloc
无法满足请求,它将返回NULL
*,并保留原始缓冲区 *。但是,如果您将NULL
结果赋回原始指针,您将丢失对该内存的唯一引用。