我试图使用以下代码将名为“Holder”的结构体放入堆中,但当我尝试使用memcpy时会出现分段错误:
Holder hold;
Holder *heapHold = memcpy(heapHold, &hold, sizeof(Holder));
我为什么会出现段错误?
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()
的返回值都被忽略了。
heapHold
分配内存。目前,memcpy正在写入一些随机地址(heapHold
未初始化),导致崩溃。Holder hold;
Holder *heapHold = malloc(sizeof(Holder));
memcpy(heapHold, &hold, sizeof(Holder));
Holder hold;
Holder *heapHold = malloc(sizeof(Holder));
memcpy(heapHold,&hold,sizeof(Holder));
memcpy(heapHold, &hold, sizeof(Holder));
中的heapHold
变量仍未初始化(也没有分配任何缓冲区),因此它指向无效的内存。
顺便说一句(我总是忘记提到)-当你使用malloc
分配内存时,不要忘记
稍后释放它..
memcpy
复制Holder
实例是有效的。在C中,这通常是成立的... - Karl Knechtel&holder
无法复制的情况吗? - Alok Singhal