1

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

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

为什么我不能取消引用指向 int 指针的 void 双指针?以下两个示例有效。

片段:1

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

片段 2:

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

2 回答 2

5

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 常见问题列表·问题 4.9

于 2014-09-09T15:50:17.943 回答
3

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

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

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

我想知道编译器是否没有对此产生警告。有没有,你忽略了警告?

请记住,您的初始化对于xptr. 请在此处查看 hacks 的帖子。

于 2014-09-09T15:50:08.480 回答