gpt4 book ai didi

c - 分配指针与 memcpy/memmove

转载 作者:太空狗 更新时间:2023-10-29 15:55:18 25 4
gpt4 key购买 nike

您好,我有一个关于 C 指针(尤其是 void *)的问题

我正在使用指向任意内存块的 void * 指针,这些内存块充当 Vector 实现的单元格。这些 blob 分配在堆上。

我的问题是为什么分配

    void *dest = CVectorNth(cv, i);
void *src = CVectorNth(cv, i-1);
*(void **)dest = *(void **)src;

不工作

    memmove(dest, src, elementSize);

确实有效。

为什么我需要使用 memmove?在我的脑海中,我正在将指针的值更改为 src 指向的地址。

我知道 memmove 是正确的方法,但现在我什至想不出原因

    dest = src;

不会工作

最佳答案

因为 *(void **)dest = *(void **)src; != memmove(dest, src, elementSize); code> 首先是赋值操作,其中 memmove() 将内存内容从 src 复制到 dest(深度复制)

编辑

假设,您的destsrc 是这样的?

  src           5   6  7  8    
+-----+ +--+--+--+---+
| 5 +----->| A|B |C | D |
+-----+ +--+--+--+---+

dest 18 19 20 21
+-----+ +--+--+--+---+
| 18 +----->| | | | |
+-----+ +--+--+--+---+

现在,*(void **)dest = *(void **)src; 是什么?

喜欢

  src           5   6  7  8    
+-----+ +--+--+--+---+
| 5 +----->| A|B |C | D |
+-----+ +--+--+--+---+

dest 18 19 20 21
+-----+ +--+--+--+---+
| 18 +----->| A| | | |
+-----+ +--+--+--+---+

因为通过分配,您将位置 5 的内容(因为使用 *)复制到位置 18。

它的粗略图是因为 *(void **)dest = *(void **)src; 我的理解有误
考虑 larsmans 的 answer here

然而,通过执行 memmove(dest, src, elementSize);:

喜欢

  src           5   6  7  8    
+-----+ +--+--+--+---+
| 5 +----->| A|B |C | D |
+-----+ +--+--+--+---+

dest 18 19 20 21
+-----+ +--+--+--+---+
| 18 +----->| A|B |C | |
+-----+ +--+--+--+---+

假设 elementSize = 3 ,

memmove 将 elementSize 元素从 src 复制到 dest 指向的内存区域(深拷贝)

通过 dest = src 做喜欢:

  src           5   6  7  8    
+-----+ +--+--+--+---+
| 5 +----->| A|B |C | D |
+-----+ --->+--+--+--+---+
|
dest | 18 19 20 21
+-----+ | +--+--+--+---+
| 5 +--- | | | | |
+-----+ +--+--+--+---+

影子副本:

发件人:Thomas (谢谢!)

More specifically, the latter technique is known as "pointer swapping" and does have its uses, but is not directly compatible with deep memory copy (it requires a different design, in particular the two memory areas being "swapped" need to be persistent). For a vector implementation it's unlikely to be of any us

关于c - 分配指针与 memcpy/memmove,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16710633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com