如何避免重新分配时溢出?

use*_*192 1 c malloc memory-management realloc calloc

我们可以通过使用and will 处理乘法来安全地分配 C 中x大小的元素。ycalloc(x, y)calloc()x*y

然而,realloc()例如仅将新大小作为参数,我想知道如何x*y使用realloc().

如果x*y不适合怎么办size_tcalloc()对此如何处理?

Ant*_*ala 5

size_t无符号类型, 的最大值是可以用或size_t分配的对象的绝对最大大小;这在宏中可用。在 32 位个人计算机上,通常为 32 位;64 位计算机上的 64 位。应该足够了。reallocmallocSIZE_MAXsize_t

为了确保 的计算item_size * n_items不会溢出,您可以除以SIZE_MAXitem_size确保结果值大于或等于n_items

size_t max_items = SIZE_MAX / item_size;
if (max_items < n_items) {
    // an overflow would occur
}
else {
    // it is ok
}
Run Code Online (Sandbox Code Playgroud)

callocNULL如果分配不成功,则必须返回,因此calloc很可能有类似于上面的检查。