将列表传递给函数以在C中用可变数量的成员填充列表

将列表传递给函数以在C中用可变数量的成员填充列表,c,arrays,list,pointers,realloc,C,Arrays,List,Pointers,Realloc,我已经编写了生成给定长度的(x,y,z)坐标列表的代码。如果我在主函数中生成此列表,则代码将起作用,但将指向该列表的指针传递到fill_xyz_list函数会产生运行时错误。大概是动态内存分配或指针有问题,但我找不到 正确的方法是什么 背景: 我试图为机器人腿生成一个步行周期轨迹,由(x,y,z)坐标的有限列表组成。由于轨迹分辨率是动态的,因此列表的长度未知 以下代码生成运行时错误: #include <stdio.h> #include <stdlib.h> // 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;
}
#包括
#包括
//核心数据结构
结构点
{
浮动x;
浮动y;
浮动z;
};
//函数为数组分配空间并用伪值填充它
空白填充列表(结构点**xyz列表ptr,整型列表大小)
{
//为100点结构分配内存
*xyz_list_ptr=realloc(*xyz_list_ptr,sizeof(结构点)*list_size);
//为每个成员设置值
int i;
对于(i=0;ix=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;//我们的(x,y,z)数组
int list_size;//我们的数组大小
int i;
//设置列表大小
列表大小=10;
//用伪值填充xyz_列表数组
填写列表(&xyz\u列表,列表大小);
//打印所有成员
对于(i=0;i这条线

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;

xyz\u list\u ptr[i]->x=i+0.1;
应该发出警告。为了节省时间,请在编译器上启用警告。错误是什么?您到底会如何“处理分配失败”?也就是说,您的意思是什么?@QPaysTaxes这取决于应用程序。有些会退出,有些会停止分配额外内存,有些会退出(更高级)将释放一些内存,然后重试。不过,所有这些都远远超出了这个问题的主题,我只是想指出可能导致内存泄漏的realloc模式。