繁体   English   中英

从函数返回结构

[英]Returning a struct from function

我试图了解如何从函数返回结构,但是我完全迷失了。

这是代码:

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

功能定义

您的函数定义使用void ,后者将函数定义为不返回任何内容 ,因此您的return语句无用(稍后将进行讨论)。

结构的使用

此外,定义似乎有些破损。 你写:

void initialize_server(struct data host_port) {

然后在函数中编写诸如data.host类的data.host 我假设您在某处具有datastruct定义,并且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

可能的解决方案

使用按值传递的结构

您可以按以下方式编写函数以返回结构,但效率不高,因为通过返回结构,您可能不得不利用堆栈来返回数据,并且还使用堆栈来传递数据。函数的参数。 这称为传递值

结构数据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定义为不返回任何内容,因此无论如何您都无需返回,因为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()
}  

代码中的一些问题

  • 函数的返回类型为void ,这意味着:不返回任何内容。 这必须是struct data

  • 里面的功能host_port.host有可能被用来代替data.host

  • 您需要返回host_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;
}

甚至使用指针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

返回时, dt将包含修改后的值。

首先,数据是struct的名称,就像int是类型的名称一样。 host_port是变量的名称。 因此,请尽可能使用host_port而不是数据。其次,返回类型为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;
};

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

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的基本概念。 希望能帮助到你。

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

所以写return host_port;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM