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_t?calloc()对此如何处理?
是size_t无符号类型, 的最大值是可以用或size_t分配的对象的绝对最大大小;这在宏中可用。在 32 位个人计算机上,通常为 32 位;64 位计算机上的 64 位。应该足够了。reallocmallocSIZE_MAXsize_t
为了确保 的计算item_size * n_items不会溢出,您可以除以SIZE_MAX并item_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很可能有类似于上面的检查。