从函数返回结构

时间:2016-01-16 10:25:04

标签: c struct codeblocks

我正在尝试理解如何从函数返回结构但我完全迷失了。

以下是代码:

void initialize_server(struct data host_port){

        printf(" Set IP Address (X.X.X.X): ");
        fgets(data.host, sizeof(data.host), stdin);
        strchomp(data.host);

        printf(" Set Port: ");
        fgets(data.port_inc, sizeof(data.port_inc), stdin);
        strchomp(data.port_inc);

        return data;
}

并且是来自.h

的代码
struct data{
    char host[16];
    char port_inc[8];
};

void initialize_server(struct data host_port);

5 个答案:

答案 0 :(得分:4)

功能定义

您的函数定义使用void,它将函数定义为返回 nothing ,因此您的return语句无用(稍后会讨论)。

结构的使用

这个定义似乎有点破碎。你写了:

void initialize_server(struct data host_port) {

然后在你的函数中编写像data.host这样的东西。我假设您在某处structdata定义,而host_portstruct data类型的变量。

要创建struct some-struct-name类型的变量,您需要编写struct some-struct-name your-variable-name。所以在你的代码中你可以拥有

struct data {
    char host[SIZE];
    port_inc[SIZE];
}

定义新复合数据类型的布局。 类型由名称data标识。要创建此类型的变量,您可以按如下方式声明它们:

struct data my_new_data_struct;  // A data structure on the stage of type
struct data *my_new_data_struct; // A pointer to data structure that 
                                 // would normally be allocated on the heap

可能的解决方案

使用按值传递的结构

您可以按如下方式编写函数来返回结构,但效率会有点低,因为通过返回结构,您可能不得不利用stack来返回数据而且您也是使用stack将参数传递给函数。这称为pass-by-value

struct data initialize_server(struct data host_port)

然后将所有data.位替换为host_port.

void initialize_server(struct data host_port)
{
        printf(" Set IP Address (X.X.X.X): ");
        fgets(**host_port**.host, sizeof(**host_port**.host), stdin);
        strchomp(**host_port**.host);

        printf(" Set Port: ");
        fgets(**host_port**.port_inc, sizeof(**host_port**.port_inc), stdin);
        strchomp(**host_port**.port_inc);

        return **host_port**;
}

使用指针

最好的方法是将指针传递给数据结构,如下所示:

void initialize_server(struct data *const host_port)

这将函数initialize_server定义为不返回任何内容,因此无论如何都不需要返回,因为host_port不是指针。该函数将变为:

void initialize_server(struct data *const host_port)
{
        printf(" Set IP Address (X.X.X.X): ");
        fgets(data.host, sizeof(host_port->host), stdin);
        strchomp(host_port->host);

        printf(" Set Port: ");
        fgets(host_port->port_inc, sizeof(host_port->port_inc), stdin);
        strchomp(host_port->port_inc);
}

但现在请注意,当你调用这个函数时,你必须传入一个指针!所以你可能有类似的东西:

void do_something( )
{
   struct data my_host_port;
   //do stuff
   initialize_server( &my_host_port); // NOTE: The ampersand!!
   // do stuff
}  

或者你可以malloc()主机端口如下。

void do_something( )
{
   struct data *my_host_port = malloc(sizeof(struct data));
   //do stuff
   initialize_server(my_host_port); // NOTE: NO ampersand as my_host_port  now already a pointer!!
   // do stuff
   free(my_host_port); // NOTE: You must free() what you malloc()
}  

答案 1 :(得分:1)

代码中的一些问题

  • 您的函数的返回类型是ng-controller,这意味着:什么都不返回。这必须是void

  • 必须使用您的函数struct data而不是host_port.host

  • 您需要返回data.host,而不是host_portdata是类型,struct data是参数的名称。< / p>

<强>解决方案

首先,host_port更容易使用typedef

struct data

现在,typedef struct data { char host[16]; char port_inc[8]; } data; 可以用作类型,而不是data

struct data

甚至可以使用pointerdata initialize_server(data host_port){ printf(" Set IP Address (X.X.X.X): "); fgets(host_port.host, sizeof(host_port.host), stdin); strchomp(host_port.host); printf(" Set Port: "); fgets(host_port.port_inc, sizeof(host_port.port_inc), stdin); strchomp(host_port.port_inc); return host_port; } 作为参数,以避免复制整个结构:

struct data

可以这样调用:

void initialize_server(data *host_port){

    printf(" Set IP Address (X.X.X.X): ");
    fgets(host_port->host, sizeof(host_port->host), stdin);
    strchomp(host_port->host);

    printf(" Set Port: ");
    fgets(host_port->port_inc, sizeof(host_port->port_inc), stdin);
    strchomp(host_port->port_inc);
}

返回时,data dt; initialize_server(&dt); // takes the address of dt 将包含修改后的值。

答案 2 :(得分:0)

首先,data是struct的名称,就像int是类型的名称一样。 host_port是变量的名称。因此,尽可能使用host_port而不是数据 其次,返回类型是void而不是struct数据。改变它。

struct data initialize_server(struct data host_port){

        printf(" Set IP Address (X.X.X.X): ");
        fgets(host_port.host, sizeof(host_port.host), stdin);
        strchomp(host_port.host);

        printf(" Set Port: ");
        fgets(host_port.port_inc, sizeof(data.port_inc), stdin);
        strchomp(host_port.port_inc);

        return host_port;
}

还考虑写

struct data_struct {
    char host[16];
    char port_inc[8];
} data;

只要在函数中设置结构的所有字段,就可以从函数中删除参数:

struct data initialize_server(){
        struct data host_port;
        printf(" Set IP Address (X.X.X.X): ");
        fgets(host_port.host, sizeof(host_port.host), stdin);
        strchomp(host_port.host);
//...

或者通过指针传递它并修改你的函数。

答案 3 :(得分:0)

这是一个结构:

struct a_tag {
   char c;
   int i;
   char *w;
};

您可以声明一个返回如下结构的函数:

struct a_tag  return_struct(void);

然后,你可以这样写:

int main() {
   struct a_tag a1;
   a1 = return_struct();
   return 0;
}

你已经定义了这样的功能:

/* return_struct: return a struct by value (copied) */
struct a_tag return_struct(void) {
   struct a_tag a;
   a.c = 'Y';
   a.i = 88;
   a.w = "My dog has fleas";
   /* can return local auto storage, because it is copied */
   return a;
}

这是返回struct的函数的基本概念。希望它有所帮助。

答案 4 :(得分:0)

首先,为了从函数返回变量,函数的返回类型必须类似于变量的类型。因此类型为void的函数不能返回如果您想要返回struct,请将函数的原型更改为:struct data initialize_server(struct data host_port); 接下来,您不能返回类型,而是返回由该类型创建的对象。

所以写return host_port;