gpt4 book ai didi

将指向较大结构的指针转换为指向较小结构的指针

转载 作者:行者123 更新时间:2023-12-03 11:51:15 27 4
gpt4 key购买 nike

这篇文章将基于 this one但会更通用一点。

我经常看到指向大型结构的指针被转换为指向较小结构的指针,我认为这是可行的,因为指针只是结构中第一个字节的地址。我还有一个问题是当大多数方法没有指向他们期望的类型时如何处理指针。

我将以 Socket API 为例:
sockaddr_storage大于 sockaddr但是指向 sockaddr_storage 的指针获得指向 sockaddr 的指针在它们被传递给函数之前

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

因此,当指针指向比预期更大的结构时,如何函数往往会处理事情。他们说

“哦,传递给我的大小 ( socklen_t addrlen) 比我想象的要大。最好将此指针转换回 sockaddr_storage!”

然后像那样访问它的成员?还是他们做了更复杂的事情?

最佳答案

sockaddr是 C 的穷人多态习语的一个完美例子。在 OO 语言中,sockaddr将是一个基类,许多协议(protocol)地址类型(sockaddr_insockaddr_in6sockaddr_ll 等)都是从中“派生的”。

基本上,一个 sockaddr被定义为有一个类型( sa_family )来指定它真正拥有的东西,然后是一些数据。指向 sockaddr 的指针通常指向派生结构(sockaddr_*),它指定数据的特定解释。
sockaddr_storage类似于普通 sockaddr ,因为它没有特定的协议(protocol)地址,只有存储空间。区别在于 sockaddr_storage指定比 sockaddr 更多的空间,使其成为存储特定协议(protocol)的合适类型sockaddr s 在。

一个简单的函数 sockaddr先看sa_family ,例如AF_INET (对于 IPv4)或 AF_INET6 (对于 IPv6)或其他东西,然后将给它的指针转换为适当的 sockaddr子类型(例如 sockaddr_in 用于 IPv4)。然后它可能会检查 addrlen确保转换的指针指向足够的空间来保存子类型。

关于将指向较大结构的指针转换为指向较小结构的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16026775/

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