我目前正在学习802.11网络,在其中一个教程中,我遇到了这段代码
send_len = sendto(sock_raw,(char *) &struct_var,64,0,(const struct sockaddr*)&sadr_ll,sizeof(struct sockaddr_ll));
将struct var类型转换为char *的目的是什么?
答案 0 :(得分:1)
除C中的位字段外,每个对象都由字节构成。 C 2018第6.2.6节讨论类型的表示形式,而6.2.6.1 2说:
除位字段外,对象由一个或多个字节,数字, 顺序,以及其编码是明确指定的还是实现定义的。
换句话说,通过C实现为您制造结构。在定义和使用结构时,编译器会根据您访问的结构成员布置字节并读写各种字节来为您构建它。
此制造的结构对于网络软件是未知的。网络软件只是来回发送字节。因此,要发送结构,您可以让网络软件发送各个字节。如果需要,将由另一端的接收软件将字节放在一起并将它们用作结构。
将指向结构的指针转换为指向char
的指针是一种表示要将制造的结构视为其组成的原始字节的方式。在这种情况下,由于函数参数被声明为void *
,因此不需要显式强制转换,并且C的规则说,指向对象的任何指针都可以隐式转换为void *
。换句话说,您只需传递&struct_var
,编译器就会自动为您转换。
答案 1 :(得分:0)
(char *)(&struct_var)在C语言中做什么?
强制类型转换从一种指针类型转换为char *
。
将struct var类型转换为char *的目的是什么?
对于ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
,C语言中不需要强制转换。任何对象指针都可以转换为void *
,而无需显式强制转换。
除非这是 old 代码(与1989年前的规则不同),或者是针对C和C ++编译器的,否则强制类型转换仅占用空间。