2013-02-23 1 views
1

Я действительно сырой с C, и у меня проблемы с актерским составом. Вот строки из моего кода, я думаю, актуальны:Converting void *

#define BUF 1025 
char hostname[BUF]; 

hostname = *(char *) qpop(&queue); 

И это ошибка, которую я получаю от компилятора:

error: incompatible types when assigning to type 'char[1025]' from type char

Обратите внимание, что функция qpop возвращает пустоту *. Я думаю, что моя проблема заключается в том, как отливать из void * в char [1025]. Из сообщения об ошибке, похоже, я использую casting для ввода char, но не для ввода char [1025]. Я пробовал:

hostname = *(char[1025] *) qpop(&queue) 

но это тоже не сработало.

Может кто-нибудь помочь мне понять, как это сделать? Спасибо!

+0

правильный способ бросить без первой звездочки: char_ptr = (символ *) void_ptr; –

+0

@NannuoLei: На самом деле, * правильный * способ не бросать вообще. 'void *' не требует кастинга, чтобы назначить его другому типу указателя. Кроме того, дополнительный '*' вообще не делает кастинг, он делает разыменование. – Cornstalks

+0

@Cornstalks благодарит за просвещение. Я знаю, что ты прав насчет пустоты, я просто забыл об этом и сразу перешел к объяснению, как делать что-либо (кроме void *). И да, первая * предназначена для разыменования. –

ответ

6

Массивы не являются первоклассными. Вы не можете назначить массив. Вам необходимо скопировать память/элементы в массив:

memcpy(hostname, qpop(&queue), BUF) 
+0

Это работает. Большое спасибо! – Alex

1

Кастинг не имеет смысла. потому что вы не можете напрямую назначить указатель на массив. FYI синтаксис: hostname = (char(*)[1025]) qpop(&queue). вы можете прочитать как «указатель на массив символов 1025»

Лучшее решение, это дать по @Cornstalks

+0

Синтаксис чего? – ouah

+0

'* char [1025]' не является допустимым именем типа. Имя типа указателя на массив '1025'' char' является 'char (*) [1025]'. Это в любом случае не имеет смысла, поскольку вы не можете назначить массив и предположив, что можете, вы не назначали бы указатель как правый операнд. – ouah

+0

oops yes, вы правы. сделал коррекцию. на самом деле я никогда не использую его для кастинга, поэтому забудьте синтаксис. – Arpit