将指向任何类型的指针转​​换为用于算术的 char 指针是否安全且可移植?

Is it safe and portable to cast pointer to any type to char pointer for arithmetic?

考虑以下片段,对于 C 和 C++ 语言,是:

int t[2] = { 0, 1 };
*( (int *)( (char *)t + sizeof(int) ) ) = 2;

总是等同于:

int t[2] = { 0, 1 };
t[1] = 2;

?

这听起来可能很奇怪,但我想出了一些在某些平台上可能是错误的原因:

  1. char 指针增量可以与 int 指针相反,除非它没有被标准授权(在这种情况下我想找到标准如此)

  2. int *char * 的转换可能是不安全的,因为不能保证它们的大小相同(在这种情况下,它可以与中间值一起使用吗转换为 void *?),并且因为标准不保证转换为 char * 然后转换为指向任何类型的指针是安全的

Is it safe and portable to cast pointer to any type to char pointer for arithmetic?

任意 类型 --> 否

(Non-null) 转换为 char * 的函数指针是 UB,然后应用的数学是 UB。

A​​ char * 甚至可能太小而无法对函数指针进行编码。