c – 通过void修改任何数据指针是否合法**

前端之家收集整理的这篇文章主要介绍了c – 通过void修改任何数据指针是否合法**前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
通过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 *的潜在别名效果.

猜你在找的C&C++相关文章