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

时间:2016-08-29 19:46:06

标签: c arrays list pointers realloc

我编写了代码来生成给定长度的(x,y,z)坐标列表。如果我在main函数中生成此列表,则代码会起作用,但是将指向列表的指针传递给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;
}

1 个答案:

答案 0 :(得分:3)

这一行

xyz_list_ptr[i]->x = i + 0.1;

应该是

(*xyz_list_ptr)[i].x = i + 0.1;

否则,您将xyz_list_ptr解释为指针数组,而不是将其解释为指向数组的指针,它确实是。

Demo.

注意: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;