使用memcpy将结构复制到堆中

时间:2011-04-22 03:20:00

标签: c struct memcpy

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

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

为什么我会出现段错?

3 个答案:

答案 0 :(得分:6)

Holder hold;

这将hold声明为Holder类型的变量。 hold未初始化。

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

memcpy(dest, source, size)size个字节从source复制到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()的返回值。

答案 1 :(得分:2)

您需要先为heapHold分配内存。目前memcpy正在写入一些随机地址(heapHold未初始化),导致崩溃。

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

答案 2 :(得分:1)

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

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

顺便说一句(我总是忘记提及) - 当您使用malloc分配内存时,请不要forget稍后将其释放..