【发布时间】:2021-03-19 16:14:35
【问题描述】:
我目前有这个代码:
struct LAYOUT {
WORD a [8] = {::Rook, ::Knight, ::Bishop, ::Queen, ::King, ::Bishop, ::Knight, ::Rook};
WORD b [8] = {::Pawn};
WORD empty [32] = {::None};
WORD c [8] = {::Pawn+0x6};
WORD d [8] = {::Rook+0x6, ::Knight+0x6, ::Bishop+0x6, ::Queen+0x6, ::King+0x6, ::Bishop+0x6, ::Knight+0x6, ::Rook+0x6};
}chessLayout;
LAYOUT* chessboard = &chessLayout;
::Rook等全局enum字段代表一个词,例如:0x2656。
我这里的目标是枚举这个结构中的所有元素,所以我写了这段代码:
for(int i = 0; sizeof(LAYOUT) / 2;i++){
printf("%x", *(reinterpret_cast<WORD*>(chessboard+i)));
}
但是,这会返回第一个值,但随后会返回不相关的垃圾值,而不是结构中的元素。
有什么想法吗?
提前致谢
【问题讨论】:
-
在
chessboard+i,你的棋盘指针还是LAYOUT*,对吧?您正在增加错误的大小。我会试试(reinterpret_cast<WORD*>(chessboard)+i)。 -
即使你解决了这个问题,一旦你以这种方式访问
b[0],你将拥有 UB。因为指针算法有特定的规则。 -
@Jarod42 我知道在数组外迭代是 UB,但即使指针在有效数组内(即使它不是“原始”数组)也是如此吗?
-
指针运算只能在数组内部进行(+ end)。我们扩展该规则,即常规变量是大小为 1 的数组。所以
a[8]是UB,即使&a[8] == &b[0]。 -
@Cedric:第一个成员有特殊待遇。 (我什至不确定以这种方式访问
a[1]是否合法,因为演员是WORD*而不是WORD(*)[8])