我正在尝试在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行的错误。
提前感谢您的帮助。
答案 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值。