我想使用指针算法从数据包结构中获取一些字段。但是下面的代码有什么问题?
在第一种情况下,我想如果我从数据包的开头开始 4 个字节(2 个短字段),我会得到 tLow 。但它没有给出预期值。此外,第二种情况我想通过从数据包的开头开始 12 个字节来获取数据字段。什么我的想法有问题吗?
struct packet{
short len;
short field;
int tLow;
int tHigh;
void *data;
}
int main()
{
struct packet pack;
struct packet *pck;
pack.len=3;
pack.field=34;
pack.tLow=712;
pack.tHigh = 12903;
pack.data = "message";
pck = &pack;
int *timeLow = (int * )pck + 4; // i want to get tLow
printf("Time Low :%d\n",*time);
char *msg = (char *)pck + 12 ;// want data
printf("Message :%s\n",msg);
return 0;
}
最佳答案
使用标准方法肯定会更好
int *timeLow = &(pck->tLow);
允许编译器在结构的任何成员之间插入填充字节。这些填充字节的规则充其量是由实现定义的……因此您必须查阅您的实现手册以确定在您的特定情况下如何(或是否)插入以及插入了多少字节。另请注意,填充字节数可能会随着不同选项的编译而变化,或者从编译器到编译器(计算机到计算机,......)
您可以尝试使用 C
宏 offsetof
,但它并不漂亮:
size_t offset = offsetof(struct packet, tLow);
/* make sure offset is a multiple of sizeof (int*) */
int *timeLow = (int*)pck + offset / sizeof (int*);
或者,使用转换为 (char*)
并从其他答案复制代码 不那么难看:-)
size_t offset = offsetof(struct packet, tLow);
int *timeLow = (int*)((char*)pck + offset);
哦!并且您的来源中缺少一个分号
关于c - void * 赋值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3882237/