我正在浏览内核源代码,我发现了这句话:
char *tagp = NULL;
/* ...CODE... */
tagp = &descriptor->b_data[sizeof(journal_header_t)];
我想知道为什么这个地址存储在一个char指针中,而不是与它所代表的内容更相关的任何其他类型,例如,如果这是一个不透明的话,可能会void
。
答案 0 :(得分:2)
个案可能有明确的使用案例,但总的来说,这有两个原因。
char
指针与void
指针具有相同的对齐要求。char
指针可用于访问(通过取消引用)任何其他类型的数据,从对象的最低寻址字节开始(连续增量的
结果,直到对象的大小,产生指向对象剩余字节的指针。)。此外,指针是算术的(如果需要,允许char
指针,而不是void
指针)。因此,使用char *
会更加健壮。
答案 1 :(得分:2)
如果是旧代码,则使用类型char *
而不是类型void *
,因为此时C中缺少类型void
。
答案 2 :(得分:0)
因为在内核中我们需要对byte执行一些操作。然后我们可以执行&,<<,>>等操作。