Перезаписать массив структур в C - PullRequest
0 голосов
/ 06 января 2011

Я пытаюсь передать указатель на массив структур функции.Затем пусть функция создаст свой собственный массив структур, заполнит его данными, а затем заменит старый массив новым массивом.

Я почти уверен, что проблема в том, что происходит, когда я пытаюсь перезаписать память.Я думаю, что я мог либо использовать неправильный метод, чтобы перезаписать память (я должен использовать функции памяти?), Или я мог бы попытаться переписать неправильную вещь.Я не совсем уверен, что я делаю не так.Если бы кто-то мог указать мне правильное направление, я был бы чрезвычайно благодарен;Я вот уже три часа стаскиваю волосы с головы.

Структура:

typedef struct
{
        char command;
        int argc;
        char* argv[];
}cmd;

Код:

int main(int argc, char *argv[])
{
    [... irrelevant code]
    cmd cmdv[count];
    cmd* cmdv_ptr = &cmdv[0];
    dissectCmd(cmdstr, cmdv_ptr);
    printf("%i", cmdv[0].argc);
    return 0;
}

void dissectCmd(char* str, cmd* cmdv)
{
    [... irrelevant code]
    cmd cmds[count];
    int i = 0;
    for(i = 0; i < count; i++)
    {
        cmd next;
        next.command = 'u';
        next.argc = 100;
        cmds[i] = next;
    }
    cmdv = cmds;
}

Ответы [ 2 ]

3 голосов
/ 06 января 2011

Вы не перезаписываете память - оператор cmdv = cmds просто копирует указатель (делая cmdv-точку в cmds.) Если вы действительно хотите скопировать память, вам нужно memcpy(cmdv, cmds, count * sizeof(cmd));

0 голосов
/ 06 января 2011

Я не уверен в этом, но попробуйте объявить

void disctctCmd (char * str, cmd * cmdv)

как

void disctCmd (char * str, cmd ** cmdv)

изменение

cmdv = cmds;

до

(* cmdv) = & cmds;

и изменение текущего вызова из основного, который теперь

dispctCmd (cmdstr, cmdv_ptr);

до

dispctCmd (cmdstr, & cmdv_ptr);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...