bind(ListenSocket, (SOCKADDR*) &s, sizeof(s));中 SOCKADDR 后面的括号和星号的用途是什么?

问题描述 投票:0回答:2

我还没有找到解释为什么要在变量之后放置星号。

这是例子:

int main(){
    WSADATA Winsockdata;
    WSAStartup(MAKEWORD(2,2), &Winsockdata);
    int ListenSocket = socket(AF_INET, SOCK_STREAM,0);

    struct sockaddr_in s;
    bind(ListenSocket,  (SOCKADDR*) &s, sizeof(s));

这是我使用此命令编译后得到的编译器警告:

gcc main.c -l Ws2_32

main.c:50:22: warning: passing argument 2 of 'bind' from incompatible pointer type [-Wincompatible-pointer-types]
       50 | bind(ListenSocket,   &s, sizeof(s)); 
          |                      ^~
          |                      |
          |                      struct sockaddr_in *

我认为括号用于将

s
转换为
sockaddr
结构,该结构在
sockaddr_in
之前使用过,以确保兼容性,但我不确定。但为什么
s
里有 & 符号呢?这不是意味着我输入了内存地址吗?我不明白这个。

此外,我研究了变量之前的星号用于将指针转换为值,当我尝试将星号放在

SOCKADDR
之前时,如下所示:

bind(ListenSocket, (*SOCKADDR) &s , sizeof(s));

我收到错误。这意味着在变量之前或之后放置星号肯定是有区别的。这是错误:

错误:“SOCKADDR”之前的预期表达式

c pointers casting winsock2
2个回答
0
投票

SOCKADDR
不是变量名而是类型名。 所以
SOCKADDR *
表示指向该类型的指针。

所以在完整表达的背景下:

(SOCKADDR*) &s

s
struct sockaddr_in
类型的变量。 一元
&
运算符获取其地址,为您提供一个
struct sockaddr_in *
类型的指针。 然后将该指针 cast 转换为
SOCKADDR *


0
投票

使用

(SOCKADDR*) &s
是正确的。 它确实将 s
address
转换为指向
SOCKADDR
的指针。 编译器只是警告您,因为就编译器而言,
sockaddr_in
SOCKADDR
技术上不相关的类型,但就 API 而言,它们是逻辑上相关的。

© www.soinside.com 2019 - 2024. All rights reserved.