使用memcpy将一个结构体复制到堆中

3

我试图使用以下代码将名为“Holder”的结构体放入堆中,但当我尝试使用memcpy时会出现分段错误:

Holder hold;
Holder *heapHold = memcpy(heapHold, &hold, sizeof(Holder));

我为什么会出现段错误?

3个回答

9
Holder hold;

这段代码声明了一个类型为Holder的变量hold,但hold是未初始化的。
Holder *heapHold = memcpy(heapHold, &hold, sizeof(Holder));

memcpy(dest, source, size)source中的size个字节复制到dest中。它假定dest已经被正确地分配了内存。由于你没有为它分配内存,所以会出现段错误。

你需要分配内存:

Holder *heapHold = malloc(sizeof *heapHold);
if (heapHold == NULL) {
    /* failed to allocate, handle error here */
} else {
    /* OK to copy.  Make sure you initialize 'hold' to something valid */
    memcpy(heapHold, &hold, sizeof *heapHold);
}

另外,memcpy() 返回第一个参数。将返回值赋给 heapHold 就好像是在说 a = a;,也就是什么都没做。在大多数实际情况中,memcpy() 的返回值都被忽略了。


这仍然假定使用memcpy复制Holder实例是有效的。在C中,这通常是成立的... - Karl Knechtel
@Karl,你能举个例子说明&holder无法复制的情况吗? - Alok Singhal
2
包含指向自身的指针或者包含指向应该进行深度复制的数据的结构体。 - Karl Knechtel

2
您需要先为heapHold分配内存。目前,memcpy正在写入一些随机地址(heapHold未初始化),导致崩溃。
Holder hold;
Holder *heapHold = malloc(sizeof(Holder));
memcpy(heapHold, &hold, sizeof(Holder));

1
Holder hold;
Holder *heapHold = malloc(sizeof(Holder));
memcpy(heapHold,&hold,sizeof(Holder));

memcpy(heapHold, &hold, sizeof(Holder));中的heapHold变量仍未初始化(也没有分配任何缓冲区),因此它指向无效的内存。

顺便说一句(我总是忘记提到)-当你使用malloc分配内存时,不要忘记稍后释放它..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接