gpt4 book ai didi

c++ - UB 具有不同类型的结构类型转换?

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:55 27 4
gpt4 key购买 nike

<分区>

下面的代码是否包含未定义的行为?该代码仅尝试用sockaddr_in 结构格式填充sockaddr_storage 结构,然后通过相同类型读回。 sockaddr_in。同样在以下调用中,该 sockaddr_storage 结构通过转换为 sockaddr 结构传递。我看到了类似的问题,想知道这段代码是否也包含它。这个程序在我测试过的任何地方都运行良好 -

Run Online

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>

using namespace std;

void fillAF_INET(sockaddr_storage &s){
sockaddr_in *p = reinterpret_cast<sockaddr_in *>(&s);
p->sin_family = AF_INET;
p->sin_port = htons(10000);
inet_pton(AF_INET, "127.0.0.1", &p->sin_addr);
}

// void fillAF_INET6(sockaddr_storage &s){...}
// void fillAF_UNIX(sockaddr_storage &s){...}

int main(){
sockaddr_storage s;
fillAF_INET(s);

sockaddr_in *p = reinterpret_cast<sockaddr_in *>(&s);
std::cout << ntohs(p->sin_port) << " ";
std::cout << boolalpha << (p->sin_family == AF_INET);

int sock = socket(AF_INET, SOCK_STREAM,0);
int r = bind(sock, (sockaddr *)&s, sizeof(s));
// further calls

return 0;
}

结果来了:10000 true 绝对正确!

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