2010-02-01 110 views
6

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

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

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


return(???); 
} 

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

感谢您的任何帮助。让我知道你是否需要澄清一些事情。

编辑:

好需要一些澄清。

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

希望澄清事情。

编辑2:

我已经想通了我的问题。对于那些感兴趣的人,我需要首先在我的功能之外有结构原型。然后我可以通过st,然后正确访问它。 感谢所有人,并对可怜的措辞表示歉意。

+0

全局变量和全局结构是不同的。通过使结构变为全局的,你只是定义一个类型而不是变量。如果你不把结构定义为全局的,其他函数不会知道这个新的*类型*,并且你的prg不会被编译。 – codaddict 2010-02-01 15:21:59

回答

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(); 
} 
0

只是:return st;

+0

我得到'从不兼容的指针类型返回' – Blackbinary 2010-02-01 15:11:14

4

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

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

  2. 这不一定是一个很好的设计模式。你的被调用者(fn)正在分配内存,但你的调用者(主)需要处理善后事宜。你也可以通过主分配内存(使用malloc或直接在堆栈上)并传递指针来使用fn来构造它。然后malloc/free发生在同一个地方。否则,你想确保命名你的FN功能清晰,如allocateMyStructure,所以很显然,返回需要被释放。

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

+0

我不认为这是一个问题,在函数中分配内存,只要函数名称清楚(像CreateNewFoo(或类似的东西))。否则,我同意你的看法。 – 2010-02-01 15:19:54

0

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

0
struct retValue { int number; }; 

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

    myval = fn(); 
} 

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

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

希望这会有所帮助, 最好的问候, 汤姆。