Каким должен быть правильный способ присвоения значения непустому указателю void * в C? - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть следующий код:

void funcA(void*   pArg)
{
    STRUCTA abc;
    .
    . // Some processing here
    .

    if (pArg)
       (STRUCTA *)pArg = abc;
}

проблема в том, что этот код выдает следующее предупреждение: предупреждение: цель назначения не является действительно lvalue;в будущем это будет серьезной ошибкой

Без приведения я получу еще одно предупреждение о том, что пытаюсь разыменовать пустой указатель ...

Поскольку предупреждения обрабатываются какошибки, я не могу использовать этот код - но я действительно не могу использовать любой другой тип указателя, кроме void * в качестве аргумента.Есть ли элегантное решение, которое мне не хватает?

Есть ли способ заставить эту работу работать?

Ответы [ 4 ]

5 голосов
/ 03 декабря 2010

(STRUCTA *)pArg имеет тип указателя, а abc - нет. Вам нужно разыменовать указатель:

*(STRUCTA *)pArg = abc;
4 голосов
/ 03 декабря 2010

Вы назначаете STRUCTA для указателя на STRUCTA.

Скорее всего:

*((STRUCTA *)pArg) = abc;
1 голос
/ 03 декабря 2010

Попробуйте это:

memcpy(pArg, &abc, sizeof(abc));

Однако вы должны убедиться, что pArg указывает на размер (abc) байтов выделенной памяти.

0 голосов
/ 03 декабря 2010

Может быть pArg = (void *) abc;?

РЕДАКТИРОВАТЬ:

pArg = (void *) (&abc);?

...