C程序中结构的寿命

Naf*_*aly 2 c

假设我有以下结构:

typedef struct plane_t Plane;
struct plane_t{
    Point p1;
    Point p2;
    Point p3;
};

typedef struct arrangement_t* Arrangement;
struct arrangement_t{
    //TODO add fields here
    int maxPlanes;
    int curPlanes;
    Plane *planes;
};
Run Code Online (Sandbox Code Playgroud)

我有以下功能:

Plane planeCreate(Point point1, Point point2, Point point3){

    Plane newPlane = {{point1.x, point1.y, point1.z}, {point2.x, point2.y, point2.z}, {point3.x, point3.y, point3.z}};
    return newPlane;
}
Run Code Online (Sandbox Code Playgroud)

假设我正在编写一个函数,它将一个平面添加到arrangment_t结构中的数组平面中.

我可以做以下事情:

arrangement->planes[arrangement->curPlanes] = planeCreate(plane.x, plane.y plane.z);
Run Code Online (Sandbox Code Playgroud)

或者这个结构在退出这个函数后会"消失",这意味着我必须遵循以下方式:

arrangement->planes[arrangement->curPlanes] = malloc(sizeof(struct plane_t));
    arrangement->planes[arrangement->curPlanes].x=plane.x;
    arrangement->planes[arrangement->curPlanes].x=plane.y;
    arrangement->planes[arrangement->curPlanes].x=plane.z; 
Run Code Online (Sandbox Code Playgroud)

小智 8

不,它不会消失.C函数按值返回对象,因此将复制结构.

此外,

arrangement->planes[arrangement->curPlanes] = malloc(sizeof(struct plane_t));
Run Code Online (Sandbox Code Playgroud)

甚至不会编译 - arrangement->planes[arrangement->curPlanes]不是指针而是结构.如果它是一个指针,那么只要你将赋值改为,你的代码就可以工作

arrangement->planes[arrangement->curPlanes]->x = plane.x;
Run Code Online (Sandbox Code Playgroud)

(访问指向的结构的成员p是使用->运算符完成的,而不是使用.)


您可能正在谈论的不是返回局部变量本身,而是返回指向它的指针.例如,这个:

int *wrong_function()
{
    int answer = 42;
    return &answer;
}
Run Code Online (Sandbox Code Playgroud)

是错误的 - answer当函数返回时,变量超出范围,并且其地址无效(因此上面将调用未定义的行为).