2011-01-06 2 views
0

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

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

Struct:

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; 
} 
+0

cmd cmds [count] - это локальная массив VLA, не так ли? даже если вы передадите cmd ** cmdv и * cmdv = cmds, это не сработает. – Nyan

ответ

3

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

+0

Он работает, спасибо! – Lienau

+0

... или вы можете просто выполнить 'cmdv [i] = next;' в цикле и полностью уничтожить 'cmds'. – caf

+0

@caf, может работать, но только если в этом цикле никогда не будет никаких преждевременных возвратов или исключений. В противном случае это может привести к частично перезаписанному массиву, который не всегда желателен. –

-1

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

недействительным dissectCmd (символ *, ул CMD * cmdv)

в

недействительным dissectCmd (символ *, ул CMD ** cmdv)

изменения

cmdv = cmds;

к

(* cmdv) = &cmds;

и изменение текущего вызова от главной который сейчас

dissectCmd (cmdstr, cmdv_ptr);

к

dissectCmd (cmdstr, & cmdv_ptr);

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

+0

вправо, это не сработает. Вы должны посмотреть на решение Криса Додда. моя версия может работать, хотя если вы измените printf («% i», cmdv [0] .argc); printf ("% i", (* cmdv_ptr) [0] .argc); D: – davogotland

+0

Благодарим вас за предложение – Lienau

+0

Это оставит cmdv_ptr в главном оборванном виде, указывая на память для локальных cmds в кадре стека dissectCmd, который был освобожден, когда dissectCmd вернулся –

Смежные вопросы