2

假设我有以下结构:

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;
};

我有以下功能:

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;
}

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

我可以执行以下操作:

arrangement->planes[arrangement->curPlanes] = planeCreate(plane.x, plane.y plane.z);

或者这个结构将在退出这个函数后“消失”,这意味着我必须通过以下方式:

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; 
4

3 回答 3

8

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

此外,

arrangement->planes[arrangement->curPlanes] = malloc(sizeof(struct plane_t));

甚至不会编译 -arrangement->planes[arrangement->curPlanes]不是指针而是结构。如果它是一个指针,那么您的代码将可以工作,只要您将分配更改为

arrangement->planes[arrangement->curPlanes]->x = plane.x;

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


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

int *wrong_function()
{
    int answer = 42;
    return &answer;
}

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

于 2013-08-02T22:58:37.957 回答
4

该结构不会“消失”,因为您是按返回它(实际上该结构将被复制),而不是通过引用(指针)返回。

于 2013-08-02T22:58:17.950 回答
0

“确定一个变量的保留时间是另一个困扰有抱负的程序员的问题。让我们看看关键字修饰符 static。不幸的是,这个修饰符有几个目的是相关的。” 使用 static .... 像 nlife {5} 因为当静态用于在函数或块中找到的变量时,它告诉编译器永远不要丢弃或重新分配变量。该变量在编译时创建并初始化为零。在这种情况下,与静态相反的是自动(默认)。该变量位于函数或块中,每次进入函数或块时都会重新分配。

/* LIFETIME, written 15 May 1992 by Peter D. Hipson */
/* An example of variable lifetime. */
#include <stdio.h> // Make includes first part of file
#include <string.h>
int nLife = {5}; // Initialize to 5, default is 0.
int main(void); // Define main() and the fact that this program doesn’t
// use any passed parameters.
void DisplayLife(void); // Define DisplayLife()
int main()
{
int nCounter = 0;
do
{
int nCountLoop = 0; /* This nCounter is unique to the loop */
nCountLoop += 3; /* Increments (and prints) the loop’s
nCounter */

nLife += nCounter;
printf(“nCountLoop is = %d\n”, nCountLoop);
}
while (++nCounter < 10); /* Increments the function’s nCounter */
DisplayLife();
printf(“Ended, nCounter is = %d\n”, nCounter);
return (0);
}
void DisplayLife()
{
printf(“DisplayLife(), nLife = %d?\n”, nLife);
}

在 LIFETIME.C 中,变量 nLife 对 main() 和 DisplayLife() 都是已知的。这种变量共享是一种可接受的编程实践,并且如前所述通常使用。在前面的例子中,如果 nLife 的声明如下: static int nLife = {5}; // 初始化为 5,默认为零。结果是一样的。原因是这个程序中只有一个源文件;因此,nLife 必须仅在一个文件中可见。只要有可能,请记住使您的外部变量为静态:如果它们仅在一个源文件中已知,则它们被不同源文件中的另一个函数无意修改的可能性要小得多。

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;
};

也许因为 void DisplayLife(void) 与 main(void) 是分开的,您可以将 nlife+=nCounter 设置在 void DisplayLife() 之外,并以这种方式从平面和排列结构中传递值....嘿我可能是错的打电话给我任何我可以打的=(

于 2016-04-25T04:20:47.237 回答