【问题标题】:realloc not allocating memory for next structrealloc 不为下一个结构分配内存
【发布时间】:2019-10-17 16:54:14
【问题描述】:

我需要动态创建一个结构数组,执行 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 应该可以完成这项工作吗?

我理解错了吗?

【问题讨论】:

  • 使用load_flights(&flight_list),您(以一种非常简单的方式)将一个指针传递给flights 结构对象的数组。在load_flights 函数中,您需要取消引用指针以获取对象数组。

标签: c memory realloc


【解决方案1】:

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

使用flight_list[0] = realloc(*flight_list, sizeof(flights)*2);,您将两个航班的空间分配给项目flight_list[0],但flight_list 本身保持不变。事实上,根本没有任何代码为flight_list 分配任何空间,但也许您只是在示例中省略了此代码。

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

【讨论】:

  • OP 的代码中有两个flight_list 变量。 main 中的一个是指向航班的指针(就像一个动态数组); load_flights 中的那个是指向航班的指针(类似于动态数组的地址)。它们都不是指针数组。
【解决方案2】:

这行有个bug:

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;

【讨论】:

  • 谢谢,这行得通!我不知道我首先必须取消引用指针然后访问 [1] 元素! ♥
  • @Deduplicator 哎呀,我忘记了我的外部括号。固定。
  • 我也想过这个,但实际上 (*flight_list)[1].price = 70;作品!现在我可以在我的主函数中访问这个数组元素了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 2014-05-18
  • 2016-03-19
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多