【问题标题】:Return Structure from Function (C)从函数返回结构 (C)
【发布时间】:2010-02-01 15:07:19
【问题描述】:

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

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

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


return(???);   
}

这是我目前的代码。

感谢您的帮助。如果您需要澄清一些事情,请告诉我。

编辑:

好的,需要澄清一下。

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

希望这可以澄清事情。

编辑 2:

我发现了我的问题。对于那些感兴趣的人,我需要首先在我的函数之外拥有结构原型。然后我可以通过 st 然后正确访问它。 感谢所有人,并对措辞不佳感到抱歉。

【问题讨论】:

  • 全局变量和全局结构不同。通过使结构 def 全局化,您只定义了一个类型而不是一个变量。如果您不使结构 def 全局化,其他函数将不知道有关此新 type 的任何信息,并且您的 prg 将无法编译。

标签: c arrays function malloc structure


【解决方案1】:
// 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();
}

【讨论】:

    【解决方案2】:

    你会得到数百个这个问题的答案。 :)

    1. 您可以直接返回一个指针。例如。 return st,然后您的 main 函数将能够像在 st->number 中一样访问结构的成员。完成后确保 main frees 指针。

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

    附:我不确定在函数内部定义结构的规则,但你不应该在这里这样做。在 main 和 fn 函数上方声明 struct retValue,这样它们都可以“看到”声明的类型。

    【讨论】:

    • 我不认为在函数中分配内存是个问题,只要函数名清楚就可以了(比如 CreateNewFoo() 之类的)。否则,我同意你的看法。
    【解决方案3】:

    我想指出的一件事...由于结构是函数的局部结构,是否存在与该结构完全匹配的全局结构,否则您可能会遇到麻烦,main() 如何知道其中的内容结构体?你能澄清一下吗?

    编辑:看来我的回答证实了我的想法。

    结构 retValue { 整数; }; int main(int argc, char **argv){ 结构 retValue *ptr; ptr = fn(); /* 做你该做的事... */ …… 返回0; } 结构 retValue * fn() { 结构 retValue* st = malloc(sizeof *st); /* 你在结构上工作吗*/ st->数字= 5; 返回圣; }

    顺便说一句,今天早些时候有人发了this

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

    【讨论】:

      【解决方案4】:

      只需:return st;

      【讨论】:

        【解决方案5】:

        请在通用头文件中声明结构并将其包含在源文件中,然后从当前函数返回 st。应该可以的。

        【讨论】:

          【解决方案6】:
          struct retValue { int number; };
          
          int main(...) {
            struct retValue *myval;
          
            myval = fn();
          }
          
          struct retValue *fn() {
            struct retValue* st = malloc(sizeof(*st));
          
            return st;
          }
          

          【讨论】:

            猜你喜欢
            • 2015-02-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-09
            相关资源
            最近更新 更多