指向指针的通用指针

Generic pointer to pointer

我知道根据标准 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 *,然后取消引用它。我得到一些随机值。我在这里遗漏了什么吗?

val = &p; 更改为 val = p;

可能是一种 "typo",因为您已经正确地传递了一次值,后来又取消引用了它。

编辑:
您可以将:val = (void *)p; 更改为 val = (void *)&p;

问题出在对 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;
}

正如您自己所说,void** 不是 通用指针。它是一个指向 void* 类型对象的指针,仅此而已。使用强制转换将其指向类型 int* 的对象是类型双关语。

在您的情况下,您只需将 int* 转换为 void*,然后再次转换为 int*。没有 void** 涉及。