将指向任何类型的指针转换为用于算术的 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;
?
这听起来可能很奇怪,但我想出了一些在某些平台上可能是错误的原因:
char
指针增量可以与 int
指针相反,除非它没有被标准授权(在这种情况下我想找到标准如此)
从 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 *
甚至可能太小而无法对函数指针进行编码。
考虑以下片段,对于 C 和 C++ 语言,是:
int t[2] = { 0, 1 };
*( (int *)( (char *)t + sizeof(int) ) ) = 2;
总是等同于:
int t[2] = { 0, 1 };
t[1] = 2;
?
这听起来可能很奇怪,但我想出了一些在某些平台上可能是错误的原因:
char
指针增量可以与int
指针相反,除非它没有被标准授权(在这种情况下我想找到标准如此)从
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 *
甚至可能太小而无法对函数指针进行编码。