You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:15:08