我试图了解如何从函数返回结构,但我完全迷路了。
代码如下:
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_port
是 struct 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/