Realloc 使动态数组为 NULL

Realloc makes dynamic-array NULL

所以首先我从一个 calloc 的 365/366 槽开始,然后我在那里放了一整年然后我的想法是当用户进入不同的年份时它会重新分配更多的内存并进入新的一年动态数组,问题是当我尝试重新分配数组时,它不起作用并将整个数组 NULL 有人知道是什么原因造成的吗?

这是我正在使用的代码行:

int old_size = est->agenda[i].sized, newsize = old_size + 365;
est->agenda[i].d = (CALENDER_DAY*) realloc(est->agenda[i].d, newsize * sizeof(CALENDER_DAY));
est->agenda[i].sized = newsize;

realloc returns NULL 当它不能满足请求时——内存仍然被分配并且未被干扰,但是你覆盖了你对它的唯一引用。

始终realloc 的结果分配给一个临时指针变量并在 更新之前检查 NULL 目标指针和大小:

/**
 * DON'T cast the result of malloc, calloc, or realloc in C.  It's unnecessary
 * and in older versions could suppress a useful diagnostic. 
 *
 * sizeof *tmp == sizeof (CALENDAR_DAY) - it's a little easier to read and maintain.
 */
CALENDAR_DAY *tmp = realloc( est->agenda[i].d, (oldsize + 365) * sizeof *tmp ); 
if ( tmp )
{
  est->agenda[i].d = tmp;
  oldsize = oldsize + 365;
}
else
{
  // realloc could not satisfy the request, handle as appropriate
}

这样您就不会丢失对已分配内存的引用。

不幸的是,realloc 不需要在发生故障时设置 errno,因此可能很难解决 为什么 realloc 调用失败。但至少这样你可以恢复。