0

我有一个将结构作为参数的函数,例如:

add_new_structure(structure s);

然后存放在里面 structure structure_list[200];

问题:

1.当我想使用结构时,我有一个类似的功能

structure *getStructure(int id)
{
return &structure_list[id];
}

如果我添加一个这样的结构,它会起作用吗:

void init()
{
   structure test;
   memset(&test,0,sizeof(structure));
   add_new_structure(test);
}

然后从另一个函数调用getStructure?像这样:

void anotherFunction()
{
    structure *got_test = getStructure(0);
}

因为我记得我不能有局部变量然后从另一个函数调用它,对吗?

2.这样存放更好吗?

改变add_new_structure() parameter to structure *s;

structure *structure_list[200];然后通过调用 add_new_structure(&test);将其存储在里面

3. 哪个更好?或者正确的方法是什么?

4

2 回答 2

0

正如我认为您指出的那样,选项 2 行不通。这比说不能在函数外部使用指向局部变量的指针要微妙一些。可以这么说,它们仅在功能仍处于“活动状态”时才有效。在选项 2 中,structure teststructure *structure_list[200]您调用add_new_structure. 此时,某个函数正在调用init,它正在调用add_new_structure. 当你从 中返回时init,你放入的内存地址structure_list不再属于原来的拥有者,这是很危险的。如果这解释过于机械化,您应该查看堆栈如何工作以了解原因。

如果不使用malloc可能会带来很多复杂性的 using 及其朋友,我会倾向于将内存存储在 中structure_list,并进行一些小的修改,您可以通过structure test引用而不是值传递。从风格上讲,这可能是两者之间的合理折衷。

void init() {
    structure test;
    memset(&test,0,sizeof(structure));
    add_new_structure(&test);
}

void add_new_structure(structure *s) {
    if (structure_count < 200) {
        structure_list[structure_count++] = *s;
    }
}

这在很大程度上取决于是什么structure(如果它本身包含指针,谁拥有这些指针?),但希望这能提供一些直觉。

于 2012-10-24T11:11:35.327 回答
0

第一种方法,即直接将实例作为参数传递,是可行的。因为调用函数时会复制整个实例。您存储的是原始结构实例的副本。

但是,您不能传递和存储指向局部变量的指针。在这种情况下会出现你上面提到的问题。

恕我直言,以上两种方法都不正确。第一种方法在将参数传递给函数时会引入过多的开销。而第二个无法实现您想要的。您最好使用malloc/动态分配内存calloc并将指针存储在数组中。不要忘记在使用结束时释放对象以防内存泄漏。像这样:

void init()
{
   structure *test = NULL;
   test = (structure *) calloc(1, sizeof(structure));
   add_new_structure(test);
}

void add_new_structure(structure *s);
于 2012-10-24T10:50:23.513 回答