为什么在内核代码中,某些变量地址存储在char指针中?

时间:2018-03-14 14:17:53

标签: c pointers linux-kernel

我正在浏览内核源代码,我发现了这句话:

char *tagp = NULL;

/* ...CODE... */

tagp = &descriptor->b_data[sizeof(journal_header_t)];

我想知道为什么这个地址存储在一个char指针中,而不是与它所代表的内容更相关的任何其他类型,例如,如果这是一个不透明的话,可能会void

3 个答案:

答案 0 :(得分:2)

个案可能有明确的使用案例,但总的来说,这有两个原因。

  • char指针与void指针具有相同的对齐要求。
  • char指针可用于访问(通过取消引用)任何其他类型的数据,从对象的最低寻址字节开始(连续增量的 结果,直到对象的大小,产生指向对象剩余字节的指针。)。此外,指针是算术的(如果需要,允许char指针,而不是void指针)。

因此,使用char *会更加健壮。

答案 1 :(得分:2)

如果是旧代码,则使用类型char *而不是类型void *,因为此时C中缺少类型void

答案 2 :(得分:0)

因为在内核中我们需要对byte执行一些操作。然后我们可以执行&,<<,>>等操作。