我需要动态创建一个结构数组,执行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应该完成这项工作吗?
我了解任何错误吗?
答案 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_list
是realloc
返回的指针。在这里,我们可以将动态数组中的一个元素向前移动。
我们也可以这样写:
(*flight_list)[1].price = 70;
答案 1 :(得分:0)
您用指向load_flights()
类型的空指针的指针调用flights*
,命名参数flight_list
,名称与main()
相同,但类型不同。
这意味着访问flight_list[1]
是一个错误。
破坏代码:
为一个航班预留空间:
flight_list[0] = calloc(1, sizeof(flights));
设置首个航班的价格:
flight_list[0]->price = 69;
等效代码:
(*flight_list)[0].price = 69;
重新分配两个航班:
flight_list[0] = realloc(*flight_list, sizeof(flights)*2);
深入探讨:
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]
用于第二次调试。