我试图通过使用以下代码将名为“Holder”的结构放入堆中,但是当我尝试使用memcpy时出现分段错误:
Holder hold;
Holder *heapHold = memcpy(heapHold, &hold, sizeof(Holder));
为什么我会出现段错?
答案 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
稍后将其释放..