我正在尝试理解如何从函数返回结构但我完全迷失了。
以下是代码:
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);
答案 0 :(得分:4)
您的函数定义使用void
,它将函数定义为返回 nothing ,因此您的return
语句无用(稍后会讨论)。
这个定义似乎有点破碎。你写了:
void initialize_server(struct data host_port) {
然后在你的函数中编写像data.host
这样的东西。我假设您在某处struct
有data
定义,而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。
struct data initialize_server(struct data 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()
}
答案 1 :(得分:1)
代码中的一些问题:
您的函数的返回类型是ng-controller
,这意味着:什么都不返回。这必须是void
。
必须使用您的函数struct data
而不是host_port.host
。
您需要返回data.host
,而不是host_port
(data
是类型,struct data
是参数的名称。< / p>
<强>解决方案强>:
首先,host_port
更容易使用typedef:
struct data
现在,typedef struct data {
char host[16];
char port_inc[8];
} data;
可以用作类型,而不是data
。
struct data
甚至可以使用pointer到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
将包含修改后的值。
答案 2 :(得分:0)
首先,data是struct的名称,就像int是类型的名称一样。 host_port是变量的名称。因此,尽可能使用host_port而不是数据 其次,返回类型是void而不是struct数据。改变它。
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);
//...
或者通过指针传递它并修改你的函数。
答案 3 :(得分:0)
这是一个结构:
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的函数的基本概念。希望它有所帮助。
答案 4 :(得分:0)
首先,为了从函数返回变量,函数的返回类型必须类似于变量的类型。因此类型为void
的函数不能返回如果您想要返回struct
,请将函数的原型更改为:struct data initialize_server(struct data host_port);
接下来,您不能返回类型,而是返回由该类型创建的对象。
所以写return host_port;