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_list
是realloc
返回的指针。这里我们可以在动态数组中向前移动一个元素。
我们也可以这样写:
(*flight_list)[1].price = 70;
我需要动态创建一个结构数组,但在执行 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_list
是realloc
返回的指针。这里我们可以在动态数组中向前移动一个元素。
我们也可以这样写:
(*flight_list)[1].price = 70;