#define _BSD_SOURCE #include #include #include void *recallocarray(void *ptr, size_t om, size_t m, size_t n) { void *newptr; size_t old_size = om * n, new_size; if (n && m > -1 / n) { errno = ENOMEM; return 0; } new_size = m * n; if (new_size <= old_size) { memset((char *) ptr + new_size, 0, old_size - new_size); } newptr = realloc(ptr, m * n); if (new_size > old_size) { memset((char *) ptr + old_size, 0, new_size - old_size); } return newptr; }