Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 尝试返回指向头文件中正向声明的结构的指针时出错_C_Pointers - Fatal编程技术网

C 尝试返回指向头文件中正向声明的结构的指针时出错

C 尝试返回指向头文件中正向声明的结构的指针时出错,c,pointers,C,Pointers,在我正在处理的一个头文件中,有一个结构的前向声明,内容如下: typedef struct my_server_t my_server_t; my_server_t *server_create(); 以及一个函数,其内容如下: typedef struct my_server_t my_server_t; my_server_t *server_create(); 现在,在.c文件中,我正在尝试实现server\u create功能。这就是我正在做的: my_server_t* ser

在我正在处理的一个头文件中,有一个结构的前向声明,内容如下:

typedef struct my_server_t my_server_t;
my_server_t *server_create();
以及一个函数,其内容如下:

typedef struct my_server_t my_server_t;
my_server_t *server_create();
现在,在
.c
文件中,我正在尝试实现
server\u create
功能。这就是我正在做的:

my_server_t* server_create(){
    struct server {
        unsigned short port;
        int pending_connections_allowed;
    } server_t;
    return (gfserver_t *)server_t;
}
但是当我试图编译
.c
代码时,我得到一个错误,它说:

error: operand of type 'struct server' where arithmetic or pointer type is required

我无法理解这里发生了什么。有人能告诉我,我怎样才能从
server\u create
类型的
my\u server\u t*
返回一个结构,我只能推测这个函数应该做什么,但你似乎想分配一个新的
my\u server\u t
结构并返回它。相反,您在函数中定义一个新结构并返回它,这是无效的

您想要的可能是:

my_server_t *server_create(void) {
    my_server_t *srv = malloc(sizeof my_server_t);
    if (srv == NULL)
        return NULL; // Failed to allocate memory.

    srv->port = /* some default value */;
    srv->pending_connections_allowed = /* some default value */;

    return srv;
}
如果需要,还可以将字段值作为参数传递:

my_server_t *server_create_with_values(unsigned short port, int pending) {
    my_server_t *srv = malloc(sizeof my_server_t);
    if (srv == NULL)
        return NULL; // Failed to allocate memory.

    srv->port = port;
    srv->pending_connections_allowed = pending;

    return srv;
}
随后在代码中,您可以使用以下函数:

my_server_t *foo = server_create();
// or
my_server_t *foo = server_create_with_values(1337, 0);
另外,当不再需要时,不要忘记释放分配的内存:

free(foo);

您尝试将结构强制转换为指针;这是不可能的。尝试
return(我的服务器*)&server\t除此之外,你的命名很糟糕。您不应将
server\u t
用作结构实例,
\u t
后缀用于类型作为第三个问题,您不应返回指向本地存储的指针,该指针将在离开函数后失效。因此,虽然它在语法上是正确的,但当我这样做时,它会调用UBT,我得到一个错误,它说
error:invalid application'sizeof'到一个不完整的类型'my_server_t'(又名'struct my_server_t')
@Amanda这是一个完全不同的问题。这意味着编译器没有看到
struct my\u server\t
的任何定义。你应该先定义它。