如何取消引用指向int指针的double void指针

时间:2014-09-09 15:47:07

标签: c pointers indirection

我的代码看起来有点像这样:

int num = 5;
int *ptr = #
void **xptr = &ptr;
printf ("values:%d\n",**(int *)xptr); 

为什么我不能引用一个void双指针,它指向一个int指针?以下两个 例子工作。

摘录:1

int *ptr = #
int **xptr = &ptr;
printf ("values:%d\n",**xptr);

摘录2:

void *ptr = #
printf ("values:%d\n",*(int *)ptr);

2 个答案:

答案 0 :(得分:2)

解决方案是在两边使用两个星号。

printf ("values:%d\n",**(int **)xptr); 

为什么呢?因为否则你会给编译器提供关于你真正做的事情的错误信息。 C风格的强制转换可以强制编译所有东西,但你必须意识到自己:如果你强迫编译器做某事,那就不要责怪他生成崩溃代码。

我想知道编译器是否没有生成警告。它和你忽略了警告吗?

请记住,xptr的初始化可能有误。请参阅haccks here的帖子。

答案 1 :(得分:2)

void **不同,

void *不是通用指针。您使用的任何void **值必须是某处实际void *值的地址。编译器应该针对void **xptr = &ptr;

发出警告
[Warning] initialization from incompatible pointer type [enabled by default]

您可以按照以下方式执行此操作

int num = 5;
void *ptr = #
void **xptr = &ptr;
printf ("values:%d\n", *((int *)*xptr));  

有关更详细的说明,请阅读comp.lang.c FAQ list · Question 4.9