你的任务
tmpMask
是错误的,因为你是类型铸造
ifa_netmask
错了,所以你正在访问它
sin_addr
通过无效指针的成员。
你拿的是
地址
属于
ifa_网络掩码
并将其键入
sockaddr_in*
,但您需要键入cast
价值
相反,就像你
ifa_addr
以下内容:
memcpy(&tmpMask, &(((struct sockaddr_in *)(ifa->ifa_netmask))->sin_addr.s_addr), 4);
可以通过删除
memcpy()
以下内容:
tmpMask = ((struct sockaddr_in *)(ifa->ifa_netmask))->sin_addr.s_addr;
当你打印出来时
ifa_网络掩码
,您正在打印
原始指针值
(使用
%u
,这是指针的未定义行为)。你应该格式化
ifa_网络掩码
以与设置格式相同的方式设置为可读字符串
IFA_地址
,因为它们都是指向
sockaddr_in
结构:
char addressBuffer[INET_ADDRSTRLEN];
char maskBuffer[INET_ADDRSTRLEN];
tmpAddrPtr = &((struct sockaddr_in *)(ifa->ifa_addr))->sin_addr;
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
tmpAddrPtr = &((struct sockaddr_in *)(ifa->ifa_netmask))->sin_addr;
inet_ntop(AF_INET, tmpAddrPtr, maskBuffer, INET_ADDRSTRLEN);
tmpMask = ((struct sockaddr_in *)(ifa->ifa_netmask))->sin_addr.s_addr;
printf("%s IP Address %s, Mask %s, %u\n", ifa->ifa_name, addressBuffer, maskBuffer, cidrMask(tmpMask));
printf("tmpmask=%u\n", tmpMask);