我目前正在学习C,我无法理解以下代码:
struct dns_header { unsigned char ra : 1; unsigned char z : 1; unsigned char ad : 1; unsigned char cd : 1; unsigned char rcode : 4; unsigned short q_count : 16; }; int main(void) { struct dns_header *ptr; unsigned char buffer[256]; ptr = (struct dns_header *) &buffer; ptr->ra = 0; ptr->z = 0; ptr->ad = 0; ptr->cd = 0; ptr->rcode = 0; ptr->q_count = htons(1); }
我不明白的是ptr =(struct dns_header *)& buffer;
任何人都可以详细解释这个吗?
解决方法
您的缓冲区只是一个连续的原始字节数组.从缓冲的角度来看,它们没有语义:你不能做像buffer-> ra = 1这样的事情.
但是,从struct dns_header *的角度来看,这些字节将变得有意义.你在用ptr =(struct dns_header *)& buffer做什么将指针映射到数据.
ptr现在将指向数据数组的开头.这意味着当你写一个值(ptr-> ra = 0)时,你实际上是在修改缓冲区中的字节0.
您正在转换缓冲区数组的struct dns_header指针的视图.