2013-02-23 42 views
1

我真的很生C,并且在演员时遇到了麻烦。下面是我的代码,我觉得行相关:转换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 *的功能。我认为我的问题是如何从void *转换为char [1025]。从错误消息,我似乎是铸造到键入char,但不是键入char [1025]。我试过这个:

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

但这也没有工作。

有人可以帮我理解如何做到这一点?谢谢!

+0

铸适当的方式是没有第一星号:char_ptr =(字符*)void_ptr; – 2013-02-23 18:43:14

+0

@NannuoLei:其实,*正确*的方式根本就不施放。 'void *'不需要强制转换将其分配给另一个指针类型。另外,额外的'*'根本没有做任何演员,它正在做一个解除引用。 – Cornstalks 2013-02-23 18:50:14

+0

@Cornstalks感谢启蒙。我知道你对虚空是对的,我只是忘记了这一点,并直接解释了如何投射任何东西(void *除外)。是的,第一个*用于解除引用。 – 2013-02-23 18:53:57

回答

6

数组不是一流的类型。你不能分配给一个数组。您必须将内存/元素复制到阵列中:

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

这工作。非常感谢! – Alex 2013-02-23 18:59:22

1

铸造没有意义。因为你不能直接指定数组的指针。 FYI的语法是:hostname = (char(*)[1025]) qpop(&queue)。可以读此为“指针的1025个字符阵列”

最佳解决方案是由@Cornstalks给

+0

什么语法? – ouah 2013-02-23 18:52:41

+0

'* char [1025]'不是有效的类型名称。 'char'数组'1025'的指针的类型名称是char(*)[1025]'。无论如何,这是没有意义的,因为你不能分配给数组,并且假设你可以,你不会将指针指定为正确的操作数。 – ouah 2013-02-23 19:05:39

+0

哎呀,你是对的。进行了更正。实际上,我从来没有用它来铸造,所以忘记了语法。 – Arpit 2013-02-23 19:09:17

相关问题