通过void **访问指针类型是否合法?
我已经查看了指针别名的标准引用,但我仍然不确定这是否是合法的C:
int *array; void **vp = (void**)&array; *vp = malloc(sizeof(int)*10);
琐碎的例子,但它适用于我看到的更复杂的情况.
由于我通过类型不是int *或char *的变量访问int *,所以它似乎不合法.我不能就此得出一个简单的结论.
有关:
> Does C have a generic “pointer to a pointer” type?
> C-FAQ question 4.9
解决方法
指向不同类型的指针可以具有不同的大小.
您可以将指向任何类型的指针存储到void *中,然后您可以将其恢复,但这意味着void *必须足够大以容纳所有其他指针.
通常,不允许处理持有int *的变量,就像它确实是一个空*一样.
还要注意,执行转换(例如,转换为int * malloc的结果)与处理包含int *的内存区域完全不同,就像它包含void *一样.在第一种情况下,如果需要,编译器将被告知转换,而在第二种情况下,您将向编译器提供错误信息.
然而,在X86上,它们通常具有相同的大小,如果您只是使用指向数据的指针,那么您就是安全的(尽管指向函数的指针可能不同).
关于通过void *或char *完成的任何写操作的别名都可以改变任何对象,因此编译器必须尽可能考虑别名.然而,在你的例子中,你正在编写一个void **(一个不同的东西),编译器可以自由地忽略对int *的潜在别名效果.