long, char 指针的指针运算

Pointer aritmetic on long, char pointers

我有一个像这样的结构:

struct holder {
    int prio;
    long id;
    char * data;
}

但出于某种原因,我将使用 malloced space 仅用于 id 和数据(不是指针,实际数据)。

现在我正在将数据从 holder 复制到另一个 space,如下所示:

struct holder * my_elem = next_data();
void * buf_k = kmalloc(sizeof(long) + maxlen * sizeof(char), GFP_KERNEL);
memcpy(buf_k, &(my_elem->id), sizeof(long));
memcpy((void *)((char *)buf_k + sizeof(long) * sizeof(char)), my_elem->data, sizeof(char) * str_len(my_elem->data));

然而,代码片段 (void *)((char *)buf_k + sizeof(long) * sizeof(char)) 对我的同事来说似乎很奇怪。特别是sizeof(long) * sizeof(char)部分。是不是正确的,或者这只是做正确事情的奇怪方式?

乘以 sizeof (char) 是毫无意义的,因为根据定义它总是 1。它永远不可能是任何其他值。我会这样做的唯一情况是将元素数量与元素大小显式相乘,例如

long* p = malloc (100 * sizeof (long));
int* q = malloc (100 * sizeof (int));
char* r = malloc (100 * sizeof (char)); 

将 strlen () 乘以 sizeof (char) 看起来非常非常可疑,我怀疑这只是一些严重误解的征兆。如果您在 memcpy 的参数中使用 strlen (),我希望得到一条评论,为什么您不添加 1 来说明尾随的零字节。

sizeof(char) 始终为 1。因此通常将其省略,因为它是多余的。

(void *)((char *)buf_k + sizeof(long)

也不需要为 memcpy() 转换为 void*。在 C 中,任何指针都可以隐式转换为 void*,因此强制转换也是多余的。所以你最终得到:

(char *)buf_k + sizeof(long)