Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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-memcpy和指针。还在工作。为什么? 编辑:_C_Pointers_Memcpy - Fatal编程技术网

c-memcpy和指针。还在工作。为什么? 编辑:

c-memcpy和指针。还在工作。为什么? 编辑:,c,pointers,memcpy,C,Pointers,Memcpy,那么我应该怎么做才能得到正确的代码呢 编辑2: 好的,我更正下面的代码 上下文 摆弄记忆。 Linux,64位。 通用条款4.8.x 密码 因为memcpy签名是 void * memcpy ( void * destination, const void * source, size_t num ); 第一个参数是指向要复制内容的目标数组的指针,类型为void*,根据 请问这里有什么陷阱 非常感谢嗯,双指针是单指针到单指针的单指针,因此它可以传递给需要空指针的函数 当然,你的代码是否正确是另

那么我应该怎么做才能得到正确的代码呢

编辑2: 好的,我更正下面的代码

上下文 摆弄记忆。 Linux,64位。 通用条款4.8.x

密码 因为memcpy签名是

void * memcpy ( void * destination, const void * source, size_t num );
第一个参数是指向要复制内容的目标数组的指针,类型为void*,根据

请问这里有什么陷阱


非常感谢

嗯,双指针是单指针到单指针的单指针,因此它可以传递给需要空指针的函数

当然,你的代码是否正确是另一回事。。。事实并非如此,只是巧合而已。请注意,不仅使用memcpy写入错误的位置,而且在printf中打印与字符串相同的错误内存位置。巧合的是,这两个错误的位置是相同的,所以你错误地认为它工作正常

尝试打印正确的内容,您将看到混乱:


打印双指针->嘿%s\n,*b

如果要将指针的表示形式复制到另一个指针,请考虑会发生什么,如下所示:

char *p;
char *q = NULL;
memcpy(&p, &q, sizeof q);
在这种情况下,编译器真的应该抱怨吗?没有

关键是void*是非类型化的。它可以指向任何对象类型。void*不能指向指向指针的指针,这不是一个约束。绝对可以


至于它为什么起作用:它不起作用。它似乎只起作用了。由于指针操作无效,代码具有未定义的行为,因此它可以执行任何操作。在更好的情况下,它崩溃并使问题变得明显。在您的情况下,错误保持沉默,程序假装它工作。

是的,但我不明白它为什么工作。代码如何才能判断出它必须再进行一级间接寻址。@拉里-它只是巧合-代码什么都不知道。@拉里代码如何判断出它必须再进行一级间接寻址-它不能,它也不工作。这只是一种错觉。不幸的是,错误的C代码并不总是崩溃。我更新了问题:如果我正在做的事情很危险,那么如果我需要指向指针的指针,我应该怎么做?@Larry-除了正确使用这些函数之外,你什么都做不了。我想这个printf调用应该至少在gcc上给你一个警告,其中-Wall和/或-Wextra-也有-Wformat.Ok。你们都帮了我很多,谢谢你们的帮助+1@Cubbi:很好,对不起:
void * memcpy ( void * destination, const void * source, size_t num );
char *p;
char *q = NULL;
memcpy(&p, &q, sizeof q);