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 *
.我不能就此得出一个简单的结论.
有关:
不同类型的指针可以有不同的大小。
您可以将指向任何类型的指针存储到 a 中void *
,然后可以将其恢复回来,但这意味着 avoid *
必须足够大才能容纳所有其他指针。
一般来说,不允许将持有 a 的变量int *
视为确实是 a 。void *
另请注意,进行强制转换(例如强制转换为int *
的结果)与处理包含 的内存区域(就像处理包含 的malloc
内存区域)完全不同。在第一种情况下,如果需要,编译器会收到转换通知,而在第二种情况下,您会向编译器提供错误信息。int *
void *
然而,在 X86 上,它们通常具有相同的大小,如果您只使用指向数据的指针,那么您是安全的(尽管指向函数的指针可能不同)。
关于别名,通过 avoid *
或 a完成的任何写操作char *
都可以改变任何对象,因此编译器必须尽可能考虑别名。然而,在您的示例中,您正在通过 a void **
(不同的东西)编写,并且编译器可以自由地忽略对 . 的潜在别名影响int *
。
归档时间: |
|
查看次数: |
259 次 |
最近记录: |