【问题标题】:i dont know this use of struct and pointers我不知道结构和指针的这种用法
【发布时间】:2018-03-22 07:06:17
【问题描述】:

谁能帮我这行代码是做什么的:

((struct mac_tb_ind *) (tb_p->data))->first_bit = 0; 

结构体定义如下:(tb_p 是一种 mem_block_t)

struct mac_tb_ind {
    unsigned char  *data_ptr;
    unsigned short  size;
    unsigned char   error_indication;
    unsigned char   first_bit;
};

typedef struct mem_block_t {
    struct mem_block_t *next;
    struct mem_block_t *previous;
    unsigned char       pool_id;
    unsigned char      *data;
} mem_block_t;

【问题讨论】:

  • 成员tb_p->data其实是一个struct mac_tb_ind指针,设置this的first_bit字段为0。
  • 哇,这是一些糟糕的代码。
  • @AnttiHaapala 但是为什么呢?我不能仅从有效的演员阵容中得出结论。
  • 该行代码用于调用未定义的行为错误。 stackoverflow.com/questions/98650/…
  • @Lundin 我认为unsigned char* 在这里用作void*。除非data 的提供者输入错误的指针,否则这里没有UB。即使data 指针错误,UB 也应该是由对齐问题引起的,而不是严格的别名。老实说,我发现您的链接中接受的答案非常具有误导性。请参阅this 帖子,其中一位回答者和我被它误导了。原来-strict-aliasing 标志在谈论完全不同的事情。

标签: c++ c struct


【解决方案1】:

tb_p->data存储在data中的指针。

(struct mac_tb_ind *) (tb_p->data) 对指针进行类型转换,以便编译器知道如何解释它

((struct mac_tb_ind *) (tb_p->data))->first_bit = 0;first_bit中存储的值设置为0

【讨论】:

  • 如果你错了,并告诉编译器使用错误的数据类型进行强制转换,请在你开始之前唤醒我。
猜你喜欢
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 2018-07-28
  • 1970-01-01
  • 2015-07-10
相关资源
最近更新 更多