c - 从函数返回结构

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

最佳答案

函数定义

你的函数定义使用了void,它定义函数返回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

可能的解决方案

使用按值传递的结构

您可以按如下方式编写您的函数以返回结构,但它会有点低效,因为通过返回结构您可能不得不利用 stack返回数据,你也在使用 stack将参数传递给函数。这叫做 pass-by-value .

结构数据初始化服务器(结构数据主机端口)

然后用host_port.替换所有data.位:

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

关于c - 从函数返回结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34825868/

相关文章:

c - 在结构指针中引用结构指针

java - 将c结构解析为java接口(interface)

c++ - 使用外部txt文件对密码进行身份验证不起作用

c++ - 循环矢量化 001

c - 修复在 'else' 之前出现的错误预期表达式的代码

c - 从链表中删除元素

c - 由于 glPushAttrib/glPopAttrib 已被弃用,保存 GL_DEPTH_FUNC 等属性的新方法是什么?

xml - 解析动态 XML

c++ - libusb 在 IDE 中不可见

c++ - 代码块错误突出显示