Создание копии / указателя на структуру typedef - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть структура, заполненная некоторыми данными, и я хотел бы сделать ее копию, присвоив ей указатель.

У меня есть следующая структура:

typedef struct items {
    double cijena;
    char sifra[100], naziv[100];
}   ITEM, *ITEMcopy;

*ITEMcopy должен быть указателем на содержимое ПУНКТА (копия).

В int main():

ITEM items[n];
ITEM *ITEMcopy = &items; // this is wrong

*ITEMcopy предполагается использовать в функции, которую япозже я хочу отредактировать содержимое:

void sort(ITEM **items, int n)

Таким образом, вместо непосредственного редактирования содержимого ITEM items[n], я хочу назначить указатель на данные, которые он содержит, и вместо этого отредактировать его.

Часть кода, который выдает ошибку: ITEM *ITEMcopy = &items;


warning: initialization from incompatible pointer type

Надеюсь, я был несколько ясен.

1 Ответ

1 голос
/ 10 апреля 2019

Когда вы пишете:

ITEM items[n];

вы создаете массив ITEM с длиной n, вся память для данных выделяется в стеке. Когда вы используете переменную items, она теперь ссылается на первый элемент в массиве items[0], она похожа на указатель, но есть некоторая дополнительная информация о ее длине.

Когда вы пишете:

ITEM *ITEMcopy;

вы создаете указатель с именем ITEMcopy, который может содержать местоположение ITEM, но для любого ITEM не выделена память, ITEMcopy просто используется для указания на уже существующий ITEM

Если вы назначите его:

ITEM *ITEMcopy = items;

ITEMcopy указывает на местоположение первого ITEM в items. Так что ITEMcopy теперь является указателем на первый элемент в items.

Когда вы пишете:

ITEM *ITEMcopy = &items;

Это предупреждение, потому что items уже действует как указатель. Таким образом, &items является указателем на указатель на ITEM, который не совместим с ITEMcopy, который ожидает указатель на ITEM

Функция sort должна выглядеть примерно так:

void sort(ITEM *items, int n)

Чтобы использовать функцию сортировки:

ITEM items[n];
sort(items, n);

Использование переменной в функции:

void sort(ITEM *items, int n)
{
    // could swap items[0] and items[1] like this
    ITEM itemBuf;
    memcpy(&itemBuf, &items[0], sizeof(ITEM));
    memcpy(&items[0], &items[1], sizeof(ITEM));
    memcpy(&items[1], &itemBuf, sizeof(ITEM));
}
...