gpt4 book ai didi

c++ - 在 sockaddr 指针和 sockaddr_in 指针之间转换

转载 作者:太空狗 更新时间:2023-10-29 20:23:26 34 4
gpt4 key购买 nike

我遇到了一个套接字编程教程,其中引用了它

"a pointer to a struct sockaddr_in can be cast to a pointer to a struct sockaddr and vice-versa"

我不明白如何将 sockaddr_in 强制转换为 sockaddr。将 Big 类型的指针转​​换为 Small 类型应该给出 UD 行为。

struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};


struct sockaddr_in {
short int sin_family; // Address family, AF_INET
unsigned short int sin_port; // Port number
struct in_addr sin_addr; // Internet address
unsigned char sin_zero[8]; // Same size as struct sockaddr
};

强制转换如何不被定义?将它们相互转换不是不安全吗?

如果我有一个只有两个整数的 A 类和有 4 个整数的 B 类。如果我有一个 B 类型的指针并将其转换为 A 类型,那么我肯定可以获取前两个元素。但是,如果 A 类首先声明了 2 个字符,然后声明了 2 个整数,那么指针将无法正确获取值,因为在这种情况下对象布局会有所不同。

编辑 1:

class Anu
{
public:
char a;
int b;
Anu()
{
a='a';
}
};
class Anurag
{
public:
Anurag() { a=4;}
int a;
int b;
int c;
int d;
};
int main()
{
Anu objanu;
Anurag objanurag;
Anurag *ptrAnurag= &objanurag;
ptrAnurag= (Anurag*)&objanu;
cout<<ptrAnurag->a; //Some weird value here
return 0;
}

假设我更改了示例,以便通过调整变量类型使两个类具有相同的大小......即使大小保持不变,对象布局仍然可能不同。

最佳答案

我将通过说未定义的行为并不总是意味着坏事即将发生来补充@gsamaras 的回答。未定义的行为实际上是说“我们*不提供任何关于如果 XYZ 发生接下来应该发生什么的规范”。

(*C++ 标准)。

这是操作系统发生的地方,并说“它由我们定义”。

尽管转换不相关的结构(sockaddr_insockaddr)可能是标准未定义的行为,但 OS API 指定它对其 API 有效。

关于c++ - 在 sockaddr 指针和 sockaddr_in 指针之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33319224/

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