C语言gfcrequest_t结构体搭配函数指针的实现代码是否正确
你的代码存在多处语法和逻辑错误,无法正常实现需求,具体问题如下:
- 你提前typedef的
gfcrequest_t是不完整类型,却把结构体的具体实现定义在gfc_create函数内部,外部的gfc_set_server、gfc_set_port根本无法识别该结构体的成员,完全不能访问server和portno字段。 gfc_create里只定义了struct out的类型,没有实际创建结构体实例,也没有分配堆内存,直接返回out属于语法错误(out是类型名不是变量);就算你创建了局部结构体变量,返回局部变量的地址也是非法的,函数退出后局部内存会被系统回收,指针会变成野指针。- 设置函数的入参是二级指针
gfcrequest_t **gfr,你直接用gfr.portno访问成员完全错误:二级指针需要先解引用拿到gfcrequest_t*类型的实例指针,再通过->访问成员,正确写法是(*gfr)->portno。 - 端口类型不匹配:你传入的port是
unsigned short类型,但结构体里定义的portno是int,属于不规范的写法,存在隐式类型转换风险。
修正后的完整可运行实现
头文件声明(gfc.h,对外暴露的接口)
#include <netdb.h> #include <stdlib.h> #include <string.h> // 对外暴露不完整类型,隐藏内部实现细节 typedef struct gfcrequest_t gfcrequest_t; // 函数声明,和你预期的调用逻辑完全兼容 gfcrequest_t *gfc_create(); void gfc_set_server(gfcrequest_t **gfr, const char *server); void gfc_set_port(gfcrequest_t **gfr, unsigned short port);
实现文件(gfc.c,内部逻辑)
// 结构体完整定义放在实现文件里,对外不可见 struct gfcrequest_t { struct hostent *server; unsigned short portno; }; gfcrequest_t *gfc_create() { // 动态分配堆内存,生命周期不受函数退出影响 gfcrequest_t *req = malloc(sizeof(gfcrequest_t)); if (req == NULL) { return NULL; } // 初始化成员为默认值,避免野值 memset(req, 0, sizeof(gfcrequest_t)); return req; } void gfc_set_port(gfcrequest_t **gfr, unsigned short port) { // 指针合法性校验,避免空指针崩溃 if (gfr == NULL || *gfr == NULL) { return; } (*gfr)->portno = port; } void gfc_set_server(gfcrequest_t **gfr, const char *server) { if (gfr == NULL || *gfr == NULL || server == NULL) { return; } (*gfr)->server = gethostbyname(server); }
调用示例(和你预期的逻辑完全一致)
int main() { gfcrequest_t *gfr = gfc_create(); if (gfr == NULL) { // 内存分配失败的异常处理 return 1; } gfc_set_server(&gfr, "example.com"); gfc_set_port(&gfr, 8080); // 你的业务逻辑... // 使用完记得释放内存,避免泄漏 free(gfr); return 0; }
内容的提问来源于stack exchange,提问作者user2236600
相关产品推荐
相关产品推荐

