Каким должен быть правильный способ присвоить значение непустому указателю void* в C?

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

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

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

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

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

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

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


person TCSGrad    schedule 03.12.2010    source источник


Ответы (4)


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

Скорее сделайте:

*((STRUCTA *)pArg) = abc;
person Benoit    schedule 03.12.2010

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

*(STRUCTA *)pArg = abc;
person Marcelo Cantos    schedule 03.12.2010
comment
Спасибо за краткий ответ ... но Бенуа ответил 2 минуты назад с точно таким же объяснением, поэтому пришлось пометить его как правильный ответ! - person TCSGrad; 03.12.2010

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

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

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

person frast    schedule 03.12.2010
comment
Принятый ответ гораздо более элегантен и указывает на ошибку, которую я совершал... - person TCSGrad; 03.12.2010
comment
Тем не менее, memcpy, вероятно, лучший способ. Все, что делает *(..) = .., на мой взгляд, не элегантно. - person buddhabrot; 03.12.2010

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

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

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

person ysap    schedule 03.12.2010
comment
@ Марсело - ты абсолютно прав. Я пропустил тот факт, что abc не был указателем для начала. - person ysap; 03.12.2010