c - void * 赋值问题

标签 c pointers void-pointers pointer-arithmetic

我想使用指针算法从数据包结构中获取一些字段。但是下面的代码有什么问题?
在第一种情况下,我想如果我从数据包的开头开始 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);

允许编译器在结构的任何成员之间插入填充字节。这些填充字节的规则充其量是由实现定义的……因此您必须查阅您的实现手册以确定在您的特定情况下如何(或是否)插入以及插入了多少字节。另请注意,填充字节数可能会随着不同选项的编译而变化,或者从编译器到编译器(计算机到计算机,......)

您可以尝试使用 Coffsetof,但它并不漂亮:

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/

相关文章:

c++ - 删除指向同一个变量的指针

使用 time 和 difftime 创建超时

将字符串格式的内存地址转换为C中的指针

c++ - 为什么指针返回值而不是地址?

c++ - 对象的变量在 vector 中重置(从 void* 转换)

c - void 表达式的无效使用

c - "-->"在 C 中是什么意思?

c - 不确定我是否理解如何创建位函数

c - 显示优化的结构

C++ - 转换空指针