重新分配不为下一个结构分配内存

时间:2019-06-01 09:01:18

标签: c memory realloc

我需要动态创建一个结构数组,执行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个元素-检查此调试屏幕截图:

Debugging Screenshot

如您所见,flight_list[0]在那儿,但flight_list[1]在那儿!但是realloc应该完成这项工作吗?

我了解任何错误吗?

3 个答案:

答案 0 :(得分:2)

此行中有一个错误:

flight_list[1]->price = 70;

[]->都取消引用指针。 a[b]等效于*(a+b)a->b等效于(*a).b。因此,您的行表示:

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

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

正确的代码是:

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

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

我们也可以这样写:

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

答案 1 :(得分:0)

您用指向load_flights()类型的空指针的指针调用flights*,命名参数flight_list,名称与main()相同,但类型不同。

这意味着访问flight_list[1]是一个错误。


破坏代码:

  1. 为一个航班预留空间:

    flight_list[0] = calloc(1, sizeof(flights));
    
  2. 设置首个航班的价格:

    flight_list[0]->price = 69;
    

    等效代码:

    (*flight_list)[0].price = 69;
    
  3. 重新分配两个航班:

    flight_list[0] = realloc(*flight_list, sizeof(flights)*2);
    
  4. 深入探讨:

    flight_list[1]->price = 70;
    

    等效代码:

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

    应该是:

    flight_list[0][1].price = 70;
    

    或者要强调它指向单个元素:

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

答案 2 :(得分:-1)

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

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

如果需要重新分配代码行,则应在调试器中观察以下存储器位置:flight_list[0][0]用于第一次调试,flight_list[0][1]用于第二次调试。