Использование memcpy для копирования структуры в кучу - PullRequest
2 голосов
/ 22 апреля 2011

Я пытаюсь поместить структуру с именем «Holder» в кучу, используя следующий код, но я получаю ошибку сегментации, когда пытаюсь использовать memcpy:

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

Почему я сегфо?

Ответы [ 3 ]

7 голосов
/ 22 апреля 2011
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() игнорируется.

2 голосов
/ 22 апреля 2011

Сначала вам нужно выделить память для heapHold. В настоящее время memcpy пишет на некоторый случайный адрес (heapHold не инициализирован), вызывая сбой.

Holder hold;
Holder *heapHold = malloc(sizeof(Holder));
memcpy(heapHold, &hold, sizeof(Holder));
1 голос
/ 22 апреля 2011
Holder hold;
Holder *heapHold = malloc(sizeof(Holder));
memcpy(heapHold,&hold,sizeof(Holder));

Переменная heapHold в memcpy(heapHold, &hold, sizeof(Holder)); все еще не инициализирована (и вообще не было выделено ни одного буфера), поэтому она указывает на недопустимую память.

Кстати (я всегда забываюупомяните это) - когда вы выделяете память, используя malloc, не forget, чтобы освободить ее позже ..

...