c++ - 使用 `memcpy()` 为指针分配地址

标签 c++ c pointers memory memcpy

memcpy( ptr, &value, sizeof(char *) );

一样
ptr = &value;

.....

我以前从未见过 memcpy() 曾经这样做过。 看来我应该用“好吧,你没有错”这句话来回应这段代码的开发者。这似乎比需要的要多一些。

编辑:注意 ptrvoid * ptr 似乎很重要。 valuedouble value


Edit2:对于那些有兴趣和我一起深入研究这个问题的人,请继续阅读。这段代码被静态分析标记为潜在的缓冲区溢出。静态分析担心目标缓冲区 ptr 可能没有足够的空间来容纳 sizeof(char *) 的信息。
我没有处理它给我的问题,而是试图准确理解这个 memcpy() 做了什么(谢谢你帮助我)。一旦我理解了发生了什么,我就必须理解为什么分配给 memcpy() 的内存大小是 sizeof(char *)memcpy() 所在的函数被调用了一次,那一次看起来像这样:

SdmJniGetPointer(blah, blah, &ptr)

这意味着 ptr 在这个函数中的实际值,在 memcpy() 调用中,是另一个指针的地址!

以前的开发人员会memcpy() sizeof(char *) 数据量,这让我很奇怪,因为这个系统是在 32 位和 64 位机器上编译的.但是,因为他将指针 (&ptr) 的地址作为 ptr 传递到函数中,他不仅避免了从 4 字节指针到 8 字节指针的转换取决于系统架构,但也完全按照他的意思使用它(我认为)。最后,在 64 位系统上,所有 double 值 都被复制到 ptr 指向的地址中,这实际上是指向不同指针的地址(&ptr),在 32 位机器上,它的一半被复制到 ptr 位置,这实际上是 &ptr。现在我只需要弄清楚 double value 真正代表什么,以及为什么他可以将它一分为二。

如果那没有意义,我会再试一次,但感觉就像他在启动指针一样。 =)

最佳答案

这会更改指针 ptr 指向的地址:

ptr = &value;

这会更改指针 ptr 指向的地址处的数据:

memcpy(ptr, &value, sizeof(char*));

在第二种情况下,ptr 仍然指向与调用前相同的地址。所以它们绝不相同。

关于c++ - 使用 `memcpy()` 为指针分配地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31037161/

相关文章:

c - 棘手的指针别名问题

c - 更新系统时间C

c++ - 将 UIImage 转换为 const char*?

c++ - 随机函数可以返回的范围是多少?

c++ - 如何从自定义数组中删除元素

c - 在C中初始化库外.lib的函数指针

c - 如何在C中将字符串(char *)转换为大写或小写

c++ - 套接字发送问题

c - 子集和 - 二维动态规划

objective-c - 将 C 指针添加到 NSMutableArray