Проблема memcpy -> попытка скопировать массив структуры
Я совершенно заблудился, почему memcpy или memmove не работают для меня.
Я пытаюсь скопировать массив struct (joblist) в другой массив той же структуры (Q), чтобы использовать его для манипулирования данными, сохраняя при этом мой исходный массив нетронутым.
Я потратил много времени на SO и поиск неисправностей в Google, и я не могу понять, почему это не сработает.
Q = new AdjacencyList[numjobs + 1]; //create a queue
// Q = joblist;
memmove(&Q, &joblist, sizeof(AdjacencyList) );
Q[0].jobnum = 30;
Я пытался просто сделать Q = joblist, но затем, когда я изменил значение в одном, оно изменилось в обоих.
struct AdjacencyList {
NodeType state; // what is present state of job?
NodePath path; // is job part of critical path?
int jobnum;
int edges;
int tocount;
int fromcount;
int to[50];
int from[50];
};
AdjacencyList *joblist;
AdjacencyList *Q;
Это структура, которую я создал.
*** Error in `p5.out': corrupted double-linked list: 0x0989e8c0 ***
======= Backtrace: =========
/lib/libc.so.6[0x47975143]
/lib/libc.so.6[0x4797b984]
/lib/libc.so.6[0x4797cd28]
/lib/libstdc++.so.6(_ZdlPv+0x20)[0x47d8d9e0]
/lib/libstdc++.so.6(_ZdaPv+0x1c)[0x47d8da3c]
Любая помощь будет принята с благодарностью. Благодарю.
SUB
2 ответа
Они так, как вы называете memmove(dst, src, sizes)
, Не является правильным. Так должно быть
memmove(Q, joblist, sizeof(AdjacencyList) * (numjobs + 1));
ОБНОВИТЬ:
Как и его имя, memmove
действует на память. Это просто копии sizes
байтовые данные из src
в dst
,
Если вы хотите скопировать массив из n объектов в Q
, вы должны сообщить функции общий размер данных, которые вы хотите скопировать, то есть size of each objects * number of objects
, Я не знаю, сколько объектов вам нужно скопировать, numjobs + 1
это только пример. Если вы хотите скопировать numjobs
так должно быть sizeof(AdjacencyList) * numjobs
,
memmove(&Q, &joblist, sizeof(AdjacencyList) );
неправильно и приводит к неопределенному поведению. Копирует sizeof(AdjacencyList)
байт с адреса joblist
по адресу Q
,
Что вам нужно использовать это:
memmove(Q, joblist, sizeof(AdjacencyList) );
скопировать один объект из joblist
в Q
, Если вы хотите скопировать numjobs + 1
объекты, которые вы должны использовать:
memmove(Q, joblist, sizeof(AdjacencyList)*(numjobs + 1));