Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 长字符指针上的指针算术_C_Pointers - Fatal编程技术网

C 长字符指针上的指针算术

C 长字符指针上的指针算术,c,pointers,C,Pointers,我有一个类似的结构: struct holder { int prio; long id; char * data; } 但出于某种原因,我将使用malloced空间仅用于id和数据(而不是指针,即实际数据) 现在我将数据从holder复制到另一个空间,如下所示: struct holder * my_elem = next_data(); void * buf_k = kmalloc(sizeof(long) + maxlen * sizeof(char), GFP_

我有一个类似的结构:

struct holder {
    int prio;
    long id;
    char * data;
}
但出于某种原因,我将使用malloced空间仅用于id和数据(而不是指针,即实际数据)

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

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)

我甚至不会那样做。在所有三个示例中,我都会使用“type*p=malloc(100*sizeof(*p))”。如果出于某种原因需要更改类型,则无需触摸sizeof的操作数。sizeof(char)不能假定总是1()。如果您正在编写内核驱动程序,则必须使用sizeof(char)。我没有添加尾随零,因为我要向用户报告数据的大小。用户必须正确地使用它。我并没有发送所有的数据——至少总是这样。每个C标准都将sizeof(char)定义为1,totten。然而,不能保证字符为8位。即使对于支持27位字符的编译器,sizeof(char)也是1。(27是我当场编出来的数字)。即使它总是1,也不能回答我的问题。奇怪吗?但如果它总是1,那么与它相乘就奇怪了。不要这样做。这不一定是“一些严重误解的症状”,它只是一个信号,你不知道它总是1。因此,这有点尴尬,代码也很混乱,因为在你不知道sizeof(char)总是1之前,每个人都认为“他在那里干什么!?”。代码几乎无法读取。谢谢,我正在寻找答案。