gpt4 book ai didi

在C中将指针转换为不同类型

转载 作者:行者123 更新时间:2023-12-04 11:02:21 26 4
gpt4 key购买 nike

int i = 42;
int *p1 = &i;
int long *p2 = (long*)p1;

这是未定义的行为吗?在 C++ 中,我认为出于某种原因,它是实现定义的行为。

我查看了 C 标准:

C99 6.3.2.3/7 A pointer to an object or incomplete type may be converted to a pointer to a different object or incomplete type. If the resulting pointer is not correctly aligned 57) for the pointed-to type, the behavior is undefined. Otherwise, when converted back again, the result shall compare equal to the original pointer.

57) In general, the concept "correctly aligned" is transitive: if a pointer to type A is correctly aligned for a pointer to type B, which in turn is correctly aligned for a pointer to type C, then a pointer to type A is correctly aligned for a pointer to type C.



术语正确对齐在实践中是什么意思?你怎么知道你是否在正确地做而没有进入未定义的行为?

最佳答案

这基本上意味着如果,比如说,int对齐到 4 个字节,并且 int long对齐到 8 个字节,行为未定义。假设你有这样的事情:

 0x04     0x08    0x0C    0x10
+------+-------+-------+-------+
| | | i | |
+------+-------+-------+-------+

在这种情况下, &i == 0x0C (这是有效的,因为 int 对齐到 4 个字节)。当你转换到 int long* ,指针被转换为对齐的指针: p2 == 0x08 ,因为我们的理论系统对齐 int long到 8 个字节,因此如果您取消引用 p1,您基本上会读取一个您不拥有的地址, ergo 未定义的行为。

关于在C中将指针转换为不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13696218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com