Проблема 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));
Другие вопросы по тегам