C语言编写网络适配器列表程序:错误处理与指针问题求助
解决C语言getifaddrs调用错误及段错误问题
编译错误的核心原因
你的代码中getifaddrs(&addresses == -1)是语法逻辑错误:运算符优先级导致&addresses == -1先被计算(这是一个布尔表达式,结果为int类型),然后把这个int值传给了getifaddrs,但该函数要求的参数是struct ifaddrs **类型,因此触发编译错误。
修正后的错误处理代码段:
struct ifaddrs *addresses; if (getifaddrs(&addresses) == -1) { perror("getifaddrs call failed"); // 用perror可以打印具体错误原因,比printf更实用 return EXIT_FAILURE; }
段错误的解决
注释错误处理代码后出现段错误,是因为部分网络接口的ifa_addr字段可能为NULL(比如仅具备链路层地址的接口),直接访问address->ifa_addr->sa_family会触发空指针解引用。必须先判断ifa_addr是否非空,再进行后续操作。
修正后的循环逻辑:
struct ifaddrs *address = addresses; while (address) { // 先判断ifa_addr是否有效,避免空指针访问 if (address->ifa_addr != NULL) { int family = address->ifa_addr->sa_family; if (family == AF_INET || family == AF_INET6) { printf("%s\t", address->ifa_name); printf("%s\t", family == AF_INET ? "IPv4" : "IPv6"); char ap[100]; const int family_size = family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6); // 可选:检查getnameinfo的返回值,提升代码健壮性 if (getnameinfo(address->ifa_addr, family_size, ap, sizeof(ap), NULL, 0, NI_NUMERICHOST) == 0) { printf("\t%s\n", ap); } else { printf("\t地址解析失败\n"); } } } address = address->ifa_next; }
完整修正代码
#include <stdio.h> #include <stdlib.h> #include <ifaddrs.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> int main() { struct ifaddrs *addresses; if (getifaddrs(&addresses) == -1) { perror("getifaddrs call failed"); return EXIT_FAILURE; } struct ifaddrs *address = addresses; while (address) { if (address->ifa_addr != NULL) { int family = address->ifa_addr->sa_family; if (family == AF_INET || family == AF_INET6) { printf("%s\t", address->ifa_name); printf("%s\t", family == AF_INET ? "IPv4" : "IPv6"); char ap[100]; const int family_size = family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6); if (getnameinfo(address->ifa_addr, family_size, ap, sizeof(ap), NULL, 0, NI_NUMERICHOST) == 0) { printf("\t%s\n", ap); } else { printf("\t地址解析失败\n"); } } } address = address->ifa_next; } freeifaddrs(addresses); return EXIT_SUCCESS; }
内容的提问来源于stack exchange,提问作者Lacochina
相关产品推荐
相关产品推荐

