realloc 不为下一个结构分配内存

realloc not allocating memory for next struct

我需要动态创建一个结构数组,但在执行 malloc 命令时我不知道大小。所以我想每次我需要另一个结构时我都可以使用 realloc !例如这段代码:

主要内容:

    int main(void) {

    flights *flight_list = NULL;
    int numFlights = 0;

    numFlights = load_flights(&flight_list);

    /* output flights. Problem: Only first flight is there, the second is not allocated! */

函数如下:

short load_flights(flights **flight_list) {

    flight_list[0] = calloc(1, sizeof(flights));
    flight_list[0]->price = 69;

    flight_list[0] = realloc(*flight_list, sizeof(flights)*2);
    flight_list[1]->price = 70;

    return 2; //num of flights-structs

问题是,实际上应该创建 2 个元素,但只有 1 个元素存在 - 查看此调试屏幕截图:

如您所见,flight_list[0] 存在,但 flight_list[1] 不存在!但是 realloc 应该做这个工作吗?

我理解错了吗?

您的 flight_list 是指向航班指针的指针数组。

对于 flight_list[0] = realloc(*flight_list, sizeof(flights)*2);,您将 space 分配给项目 flight_list[0] 的两个航班,但 flight_list 本身保持不变。事实上,根本没有为 flight_list 分配任何 space 的代码,但也许您只是在示例中遗漏了这段代码。

如果 realloc 代码行是您想要的,您应该在调试器中观察这些内存位置:flight_list[0][0] 用于第一次飞行,flight_list[0][1] 用于第二次。

这一行有一个错误:

flight_list[1]->price = 70;

[]-> 取消引用指针。 a[b] 等同于 *(a+b)a->b 等同于 (*a).b。因此,您的行意味着:

(**(flight_list + 1)).price = 70;

然而,flight_list(在load_flights中)是指向main中的flight_list变量的指针!在 main 的上下文中,您正在计算 &flight_list + 1,这是一个无效指针:您正在获取恰好位于局部变量旁边的内存内容。

正确的代码是:

(*(*flight_list + 1)).price = 70;

*flight_listrealloc返回的指针。这里我们可以在动态数组中向前移动一个元素。

我们也可以这样写:

(*flight_list)[1].price = 70;