gpt4 book ai didi

C如何按值复制?

转载 作者:太空宇宙 更新时间:2023-11-04 08:23:38 27 4
gpt4 key购买 nike

我正在研究以下函数来解析 CIDR 表示法并最终返回所有 IP 地址的数组。

虽然我在这一行遇到了问题:network_addr = last_addr = addr.s_addr;

我需要 3 个变量来保存网络地址、最后地址和原始地址,以便我可以对它们应用位移运算符。但是,目前它似乎作用于 addr.s_addr 的引用。

如何按值制作副本?

int parse_ipv4_cidr(char *ip_cidr)
{
struct in_addr addr;
int cidr;
char *token;
uint32_t netmask, network_addr, last_addr;

token = strtok(ip_cidr, "/");

/*
* Validate IPV4 CIDR address
*/
if(!inet_aton(token, &addr) ||
!(token = strtok(NULL, "/")) ||
(atoi(token) < 0 || atoi(token) > 32))
{
printf("Invalid CIDR notation. Example format: 192.0.0.1/21\n");
return 1;
}

cidr = atoi(token);
network_addr = last_addr = addr.s_addr;

/*
* Create the netmask
*/
netmask = 0xFFFFFFFF;
netmask <<= 32 - cidr;
netmask = ntohl(netmask);

/*
* Calculate network address
*/
network_addr = network_addr & netmask;

/*
* Calculate last address
*/
last_addr = (last_addr & netmask) + ~netmask;

...
}

最佳答案

我认为您的问题不在于引用/按值复制(您已经在按值复制)。在我看来,您搞砸了网络/主机字节顺序。

struct in_addrsa_addr字段是网络字节序;当您将其复制到 network_addrlast_addr 时,您应该将其转换为主机字节顺序,因为您将进行移位和其他操作。

此外,出于某种原因,代码假定 netmask 是网络字节顺序,而实际上它是主机字节顺序。事情并没有加起来。

只要坚持主机字节顺序,一切都会正常进行。

改变这一行:

network_addr = last_addr = addr.s_addr;

收件人:

network_addr = last_addr = ntohl(addr.s_addr);

并删除这一行:

netmask = ntohl(netmask);

您可能想在最后添加 return network_addr; 并可能将返回类型更改为 uint32_t

关于C如何按值复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32181183/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com