使用malloc和realloc的更好方法?

问题描述 投票:0回答:1

我正在制作一个简单的物理玩具,每当我按“A”时,就会产生一个新的圆圈。我发现使用数组实现此目的的唯一方法就是这样做。

if(numCircles == 0) {
    circles = (physCircle*)malloc(sizeof(physCircle)*(numCircles+1));
} else {
    circles = realloc(circles, sizeof(physCircle)*(numCircles+1));
}

每次制作一个圆圈时我都会检查这一点,我想知道是否有更好的方法来做到这一点。

我尝试在每次调用时使用 malloc,但这会导致旧的循环从内存中清除,我尝试在每次调用时使用 realloc,但你无法在不首先分配内存的情况下重新分配内存,至少看起来是这样。我一开始就不想在数组中放一些东西,所以我永远不必检查它是否为空,因为这感觉很糟糕并且不可持续。

c memory game-development
1个回答
0
投票

您所显示的代码存在三个问题。您未显示的代码可能还有更多问题。

  • 您正在投射
    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; } }
    
© www.soinside.com 2019 - 2024. All rights reserved.