据我所知,根据标准void *
是通用指针,void **
不是。所以,在我的程序中,我正在尝试转换void *
而不是直接输入强制转换void **
,但我没有得到预期的结果。我想我在这里缺少一些非常基本的东西。
#include <stdio.h>
void check(void **p)
{
printf("value: %d\n", *(int *)*p);
}
int main()
{
int a[] = {6,2,5,1,8};
int *p;
p = a;
void **val;
val = (void *)p;
check(val);
return 0;
}
我有一个void **
指针val
,它指向int *
,但已投放到void *
。我将此传递给函数check
,它期待void **
。在我的printf
中,我首先将*p
(void *
)投射到int *
,然后将其取消。我得到一些随机值。我在这里错过了什么吗?
答案 0 :(得分:2)
问题在于对printf
的调用:
printf("value: %d\n", *(int *)*p);
在main
中,val
(void **
)包含int *
的内容。然后将其传递给check
,现在称为p
。这需要转换为int *
才能正确读取:
printf("value: %d\n", *(int *)p);
当然,由于void **
不是通用指针,因此执行此操作并没有多大意义。最好摆脱没有被使用的额外间接水平:
void check(void *p)
{
printf("value: %d\n", *(int *)p);
}
int main()
{
int a[] = {6,2,5,1,8};
int *p;
p = a;
void *val;
val = p;
check(val);
return 0;
}
答案 1 :(得分:0)
将val = &p;
更改为val = p;
可能这是一种&#34;拼写错误&#34;因为你已经正确地传递了一次值,后来也解除了引用它。
编辑:
您可以将val = (void *)p;
更改为val = (void *)&p;
答案 2 :(得分:0)
正如你自己所说,void**
不是通用指针。它是一个指向void*
类型对象的指针,而不是其他任何东西。使用强制转换将其指向int*
类型的对象是类型惩罚。
在您的情况下,您只需将int*
转换为void*
,然后再转回int*
。没有void**
参与。