从函数返回结构

Returning a struct from function

我正在尝试了解如何从函数中 return 结构,但我完全迷路了。

代码如下:

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);

代码中的一些问题:

  • 你函数的return类型是void,意思是:return什么都没有。这必须是 struct data.

  • 在你的函数中必须使用 host_port.host 而不是 data.host

  • 你需要returnhost_port,而不是datastruct data是类型,host_port是名字参数)。

解决方法:

首先,struct data使用typedef更容易:

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

现在,data 可以用作类型,而不是 struct data

data 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;
}

或者甚至使用 pointerstruct 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

在 return 上,dt 将包含修改后的值。

首先,data是struct的名字,就像int是类型的名字一样。 host_port 是一个变量名。所以尽可能使用 host_port 而不是数据 其次,return 类型是 void 而不是结构数据。也改一下。

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);
//...

或者通过指针传递并在函数内部修改。

这是一个结构:

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

你可以声明一个函数,returns一个这样的结构:

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

这是函数返回结构的基本概念。希望对你有帮助。

函数定义

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

结构的使用

此外,定义似乎有点不正确。您写了:

void initialize_server(struct data host_port) {

然后在您的函数中编写 data.host 之类的内容。我假设您在某处为 data 定义了 struct 并且 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

可能的解决方案

使用按值传递的结构

您可以将您的函数按如下方式编写到 return 结构,但这会有点低效,因为通过 returning 结构您可能不得不使用 stack to return the data and you are also using the stack to pass in the parameter to the function. This is called pass-by-value.

结构数据initialize_server(结构数据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 定义为 return 什么都没有,所以您无论如何都不需要 return 因为 not 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()
}  

首先,为了return函数中的变量,函数的return类型必须与variable.so函数的类型相似type void can't return anything.Since you want to return a struct,change your function prototype to:struct data initialize_server(struct data host_port); 接下来,你不能return一个类型,而是那个类型创建的对象。

所以写return host_port;