假设我有以下结构:
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当函数返回时,变量超出范围,并且其地址无效(因此上面将调用未定义的行为).