【问题标题】:How to dereference a double void pointer to an int pointer如何将双空指针取消引用到 int 指针
【发布时间】:2014-11-03 03:05:05
【问题描述】:

我的代码有点像这样:

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);

【问题讨论】:

    标签: c pointers indirection


    【解决方案1】:

    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

    【讨论】:

    • ,是的,它确实为 void **xptr = &ptr 生成了警告。感谢您指出 void ** 值必须是 void * 的地址,而不是 int 或 char 的地址。 voidPointer.c:6:19: warning: initialization from incompatible pointer type [enabled by default] void **xptr = &ptr;
    • 感谢您的常见问题解答,Q4.9 确实回答了我的问题。
    【解决方案2】:

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

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

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

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

    请记住,xptr 的初始化可能是错误的。请参阅来自 hacks here 的帖子。

    【讨论】:

    • 我的反对意见。 void **xptr = &ptr; 在 OP 的代码 sn-p 中毫无意义。建议printf ("values:%d\n", **(int **)xptr); 是错误的。
    • 如果我是正确的,这个解决方案没有错。只是他初始化获取xptr 可能是错误的。
    • 那你应该更正一下,否则会被认为是错误的。
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2020-06-05
    • 1970-01-01
    • 2012-01-04
    相关资源
    最近更新 更多