从函数返回结构(C)

时间:2010-02-01 15:07:19

标签: c arrays function malloc structure

我需要在函数内部创建一个结构(使用malloc动态) 然后我需要能够将它发送到我的主要,并在那里使用它。 我创建它没有任何问题,我只需要帮助将它发送到我的主要部分,而且我也不确定如何在它到达之后访问它。

struct retValue * fn() {
struct retValue
{
    int number;
};

struct retValue* st = malloc(sizeof(*st));


return(???);   
}

这是我到目前为止的代码。

感谢您的帮助。如果你需要澄清的话,请告诉我。

编辑:

好的,需要澄清一些。

我想要实现的是能够通过函数将结构传递给我的main。在函数内部,我必须声明变量,并为它们赋值。然后在主要我必须将结构的每个变量打印到屏幕上。不能使用全局变量(因此我假设没有全局结构)。

希望澄清事情。

编辑2:

我已经弄清楚了我的问题。对于那些感兴趣的人,我需要首先在我的函数之外使用结构原型。然后我可以通过st然后正确访问它。 感谢所有人,并为可怜的措辞感到抱歉。

6 个答案:

答案 0 :(得分:8)

// make the structure def global so that main() and fun() know about it.
struct retValue {
 int number;
};    

// function fn returns a pointer to the structure retValue
struct retValue * fn() {     

 struct retValue* st = malloc(sizeof(*st));

 // return the pointer to the newly allocated structure.
 return(st);   
}

int main() {

 // call fn() to create a new structure dynamically.
 struct retValue *st = fn();
}

答案 1 :(得分:4)

您将获得数百个问题的答案。 :)

  1. 您可以直接返回指针。例如。 return st,您的主要功能将能够像st->number中那样访问结构的成员。确保主free完成后指针。

  2. 这不一定是一个很好的设计模式。你的被调用者(fn)正在分配内存,但你的调用者(主)需要处理后果。您也可以使用main来分配内存(使用malloc或直接在堆栈上)并传入指针以供fn使用。然后malloc / free发生在同一个地方。否则,您希望确保将您的fn函数命名为allocateMyStructure之类的清楚,因此很明显需要释放返回。

  3. P.S。我不确定在函数内部定义结构的规则,但是你不应该在这里做。在main和你的fn函数之上声明struct retValue,这样它们就可以“看到”声明的类型。

答案 2 :(得分:1)

有一件事我想指出......因为结构是函数的本地结构,是否有一个完全匹配的全局结构,否则你可能遇到麻烦,main()如何知道什么是在那个结构?你能说清楚吗?

编辑:我的回答似乎证实了我的想法。

struct retValue
{
    int number;
};

int main(int argc, char **argv){
   struct retValue *ptr;
   ptr = fn();
   /* do what you have to do... */
   ....
   return 0;
}

struct retValue * fn() {
   struct retValue* st = malloc(sizeof *st);

   /* do you work on the structure */
   st->number = 5;

   return st;   
}

顺便提一下,今天早些时候有人发布了this

希望这有帮助, 最好的祝福, 汤姆。

答案 3 :(得分:0)

只是:return st;

答案 4 :(得分:0)

请在公共头文件中声明结构并将其包含在源文件中,然后从当前函数返回st。这应该有用。

答案 5 :(得分:0)

struct retValue { int number; };

int main(...) {
  struct retValue *myval;

  myval = fn();
}

struct retValue *fn() {
  struct retValue* st = malloc(sizeof(*st));

  return st;
}