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)
我有一个像这样的结构:
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)