[英]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
。 我假设您在某处具有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
您可以按以下方式编写函数以返回结构,但效率不高,因为通过返回结构,您可能不得不利用堆栈来返回数据,并且还使用堆栈来传递数据。函数的参数。 这称为传递值 。
结构数据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
,而不是data
( struct 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.