c,将void *指向的值赋给void * array

时间:2012-03-01 02:36:55

标签: c void-pointers

我正在尝试在void *数组中指定void *指向的值。以下是我到目前为止的情况:

23 void queue_enqueue(void *q, void *item) {
24 int len = 0 ;
25 
26 len = sizeof(q) ;
27 q[len-1] = 
28     item ;
29     
30 return ;
31 
32 }

使用此编译器错误:

myqueue.c:27: warning: dereferencing ‘void *’ pointer
myqueue.c:28: error: invalid use of void expression

我现在一直在寻找一个小时的答案,但我没有看到类似于我在这里给出的实现。如果你想知道,是的,这是家庭作业,原型是由教练给出的。

因为它们被传递为void *我无法使用gcc typeof运算符。

我对这个警告没问题。我知道这只是gcc告诉我“小心我们不会为你检查这个”,但我无法摆脱第28行的错误。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

这不是void*的数组,它是void的数组(实际上并不存在),并且取消引用它会得到void,这不是“{1}}真实类型“,所以你不能分配给它。

如果您尝试使用void*数组,请将其更改为

void queue_enqueue(void** q, void* item)

void queue_enqueue(void* q[], void* item) // same as above

还要意识到你的程序会做

q[sizeof(void**) - 1] = item;

每一次。 sizeof为您提供指针类型的大小,而不是数组。如果要知道数组的长度,则必须将数组的长度作为单独的参数传递。

答案 1 :(得分:1)

您需要一个void*数组:

void queue_enqueue(void *q[], void *item)

答案 2 :(得分:0)

void是一种没有大小的类型。 因此,不存在一系列空隙。 (因为数组定义了单位数量,然后使用sizeof()运算符跳转。

你必须将void *转换成某些东西*,与你实际存储的东西大小相同的东西,所以说你有类型T,它是相同的SIZE(我不是说同样的东西),

T* q2 = (T*)q;
T* item2 = (T*)item;
q2[len-1] = &item;

这将起作用,因为C通过引用传递指针 由于T将是一个真正的类型,编译器允许你这样做 由于T与实际存储值的大小相同,因此您将获得正确的值存储位置。

请注意,void *作为一个数组,将包含一个指向void类型数组的指针。 void *作为单个值将包含单个void值。