long,char指针上的指针算术

时间:2015-01-28 10:40:27

标签: c pointers

我有一个结构:

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

但出于某种原因,我将使用malloced空间来获取id和数据(不是指针,实际数据)。

现在我正在将数据从持有者复制到另一个空间,如下所示:

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))对我的collugues来说似乎很奇怪。特别是sizeof(long) * sizeof(char)部分。这不是正确的,还是只是一种做正确事情的奇怪方式?

2 个答案:

答案 0 :(得分:1)

乘以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。

答案 1 :(得分:1)

sizeof(char)总是1.所以通常情况下这是多余的。

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

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

(char *)buf_k + sizeof(long)