有人可以向我解释这句话,也许可以给我一个快速而简单的分解铸造:)

时间:2013-09-19 08:16:16

标签: pointers casting

我是C ++的新手,可以对以下句子进行一些澄清:

  

“指向struct sockaddr_in的指针可以强制转换为指向struct sockaddr的指针,反之亦然。所以即使connect()想要一个struct sockaddr *,你仍然可以使用struct sockaddr_in并在最后抛出它分钟!“

这句话是什么意思?

1 个答案:

答案 0 :(得分:1)

假设你有

struct sockaddr_in *var;

你有

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

你可以这样做:

connect(fd, (struct sockaddr *) var, addrlen);

这是因为这些函数系列不总是收到sockaddr_in,它们可以接收,例如sockaddr_in6。所以你可以将两个指针都转换为sockaddr,它们会起作用。

¿如何?我们认为这些结构的第一个字段是相同的,如果你将它们转换为sock_addr,你仍然可以在没有和未定义的行为的情况下读取第一个字段,然后将它们作为该字段定义的特定结构来处理。

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

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

sa_family字段将与sin_family字段相同,因此您可以在转换之前知道它是AF_INET还是AF_INET6。