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

Rya*_*ing 7 c pointers strict-aliasing

通过void **?访问指针类型是否合法?

我查看了指针别名的标准引用,但我仍然不确定这是否是合法的C:

int *array;
void **vp = (void**)&array;
*vp = malloc(sizeof(int)*10);
Run Code Online (Sandbox Code Playgroud)

琐碎的例子,但它适用于我所看到的更复杂的情况.

似乎它不合法,因为我int *通过一个类型不是int *或的变量来访问它char *.我不能就此得出一个简单的结论.

有关:

650*_*502 2

不同类型的指针可以有不同的大小。

您可以将指向任何类型的指针存储到 a 中void *,然后可以将其恢复回来,但这意味着 avoid *必须足够大才能容纳所有其他指针。

一般来说,不允许将持有 a 的变量int *视为确实是 a 。void *

另请注意,进行强制转换(例如强制转换为int *的结果)与处理包含 的内存区域(就像处理包含 的malloc内存区域)完全不同。在第一种情况下,如果需要,编译器会收到转换通知,而在第二种情况下,您会向编译器提供错误信息。int *void *

然而,在 X86 上,它们通常具有相同的大小,如果您只使用指向数据的指针,那么您是安全的(尽管指向函数的指针可能不同)。

关于别名,通过 avoid *或 a完成的任何写操作char *都可以改变任何对象,因此编译器必须尽可能考虑别名。然而,在您的示例中,您正在通过 a void **(不同的东西)编写,并且编译器可以自由地忽略对 . 的潜在别名影响int *

  • @NikosC:不。如果您编写“int *x = (int *)malloc(...)”,编译器就会知道您正在执行转换并可以正确存储该值。当然,需要 `malloc` 返回一个可用于任何对象的指针。相反,如果您说“*p = malloc(...)”,其中“p”是“void **”,则编译器将执行原始写入操作,认为“p”指向的内存用于“void *” ,因此即使需要也不会执行转换。 (2认同)