我正在制作一个简单的物理玩具,每当我按“A”时,就会产生一个新的圆圈。我发现使用数组实现此目的的唯一方法就是这样做。
if(numCircles == 0) {
circles = (physCircle*)malloc(sizeof(physCircle)*(numCircles+1));
} else {
circles = realloc(circles, sizeof(physCircle)*(numCircles+1));
}
每次制作一个圆圈时我都会检查这一点,我想知道是否有更好的方法来做到这一点。
我尝试在每次调用时使用 malloc,但这会导致旧的循环从内存中清除,我尝试在每次调用时使用 realloc,但你无法在不首先分配内存的情况下重新分配内存,至少看起来是这样。我一开始就不想在数组中放一些东西,所以我永远不必检查它是否为空,因为这感觉很糟糕并且不可持续。
您所显示的代码存在三个问题。您未显示的代码可能还有更多问题。
malloc
,这是[在C中不建议][https://stackoverflow.com/questions/605845/should-i-cast-the-result-of-malloc-in-c]。realloc
赋值回变量。但是 realloc
可以 失败,当失败时它会返回 NULL
。如果您不分配给临时变量并检查这一点,您可能会丢失指向原始内存的指针。if(numCircles == 0) {
circles = malloc(sizeof(physCircle) * (numCircles + 1));
} else {
physCircle *temp = realloc(circles, sizeof(physCircle) * (numCircles + 1));
if (!temp) {
// You have an opportunity to handle the error.
}
else {
circles = temp;
}
}
realloc
都会执行动态分配,并且如果相邻内存无法增长,则 may 会导致将旧内存复制到新位置。这可能很昂贵。您希望尽可能少地进行这些重新分配。这通常是通过每次乘以两倍来完成的。您可能需要单独跟踪分配的容量和实际使用的大小。
if(numCircles == 0) {
circles = malloc(sizeof(physCircle) * (circlesCapacity + 1));
} else {
physCircle *temp = realloc(circles, sizeof(physCircle) * circlesCapacity * 2);
if (!temp) {
// You have an opportunity to handle the error.
}
else {
circles = temp;
circlesCapacity *= 2;
}
}