将列表传递给函数以在 C 中用可变数量的成员填充列表
Passing list to a function to fill the list with variable number of members in C
我编写了代码来生成给定长度的 (x, y, z) 坐标列表。如果我在主函数中生成此列表,代码会运行,但将指向列表的指针传递给 fill_xyz_list 函数会产生运行时错误。估计是动态内存分配或指针有问题,但我找不到!
正确的做法是什么?
背景:
我正在尝试为机器人腿生成步行循环轨迹,该轨迹由有限的 (x, y, z) 坐标列表组成。由于轨迹分辨率是动态的,列表长度未知
以下代码产生运行时错误:
#include <stdio.h>
#include <stdlib.h>
// core data structure
struct Point
{
float x;
float y;
float z;
};
// function that allocates space for our array and fills it with dummy values
void fill_xyz_list(struct Point **xyz_list_ptr, int list_size)
{
// allocate memory for 100 Point structs
*xyz_list_ptr = realloc(*xyz_list_ptr, sizeof(struct Point)*list_size);
// set values for each member
int i;
for (i=0; i<list_size; i++)
{
xyz_list_ptr[i]->x = i + 0.1;
xyz_list_ptr[i]->y = i + 0.2;
xyz_list_ptr[i]->z = i + 0.3;
}
}
int main()
{
struct Point *xyz_list = NULL; // our array of (x, y, z)
int list_size; // our array size
int i;
// set list size
list_size = 10;
// fill xyz_list array with dummy values
fill_xyz_list(&xyz_list, list_size);
// print all members
for (i=0; i<list_size; i++)
{
printf("xyz_list[%d]: x=%.2f, y=%.2f, z=%.2f\n", i, xyz_list[i].x, xyz_list[i].y, xyz_list[i].z);
}
return 0;
}
这一行
xyz_list_ptr[i]->x = i + 0.1;
应该是
(*xyz_list_ptr)[i].x = i + 0.1;
否则,您会将 xyz_list_ptr
解释为指针数组,而不是将其解释为指向数组的指针,而事实确实如此。
注意: 将 realloc
分配回正在重新分配的指针可能会导致内存泄漏。你应该把它分配给一个临时的,检查它是否有NULL
,然后才把临时的分配给原来的指针:
struct Point *tmp = realloc(*xyz_list_ptr, sizeof(struct Point)*list_size);
if (!tmp) {
... // deal with allocation failure
... // exit the function
}
*xyz_list_ptr = tmp;
我编写了代码来生成给定长度的 (x, y, z) 坐标列表。如果我在主函数中生成此列表,代码会运行,但将指向列表的指针传递给 fill_xyz_list 函数会产生运行时错误。估计是动态内存分配或指针有问题,但我找不到!
正确的做法是什么?
背景: 我正在尝试为机器人腿生成步行循环轨迹,该轨迹由有限的 (x, y, z) 坐标列表组成。由于轨迹分辨率是动态的,列表长度未知
以下代码产生运行时错误:
#include <stdio.h>
#include <stdlib.h>
// core data structure
struct Point
{
float x;
float y;
float z;
};
// function that allocates space for our array and fills it with dummy values
void fill_xyz_list(struct Point **xyz_list_ptr, int list_size)
{
// allocate memory for 100 Point structs
*xyz_list_ptr = realloc(*xyz_list_ptr, sizeof(struct Point)*list_size);
// set values for each member
int i;
for (i=0; i<list_size; i++)
{
xyz_list_ptr[i]->x = i + 0.1;
xyz_list_ptr[i]->y = i + 0.2;
xyz_list_ptr[i]->z = i + 0.3;
}
}
int main()
{
struct Point *xyz_list = NULL; // our array of (x, y, z)
int list_size; // our array size
int i;
// set list size
list_size = 10;
// fill xyz_list array with dummy values
fill_xyz_list(&xyz_list, list_size);
// print all members
for (i=0; i<list_size; i++)
{
printf("xyz_list[%d]: x=%.2f, y=%.2f, z=%.2f\n", i, xyz_list[i].x, xyz_list[i].y, xyz_list[i].z);
}
return 0;
}
这一行
xyz_list_ptr[i]->x = i + 0.1;
应该是
(*xyz_list_ptr)[i].x = i + 0.1;
否则,您会将 xyz_list_ptr
解释为指针数组,而不是将其解释为指向数组的指针,而事实确实如此。
注意: 将 realloc
分配回正在重新分配的指针可能会导致内存泄漏。你应该把它分配给一个临时的,检查它是否有NULL
,然后才把临时的分配给原来的指针:
struct Point *tmp = realloc(*xyz_list_ptr, sizeof(struct Point)*list_size);
if (!tmp) {
... // deal with allocation failure
... // exit the function
}
*xyz_list_ptr = tmp;