将指针转换为char指针以进行算术运算是否安全又可移植?

问题描述

考虑以下代码段(对于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 *的转换可能是不安全的,因为无法保证它们的大小相同(在这种情况下,它可以与中间转换为{{ 1}}?),并且因为该标准不能保证先转换为void *然后再转换为任何类型的指针都是安全的

解决方法

将指针转换为char指针以进行算术运算是否安全又可移植?

任何类型->否

强制转换为char *的(非空)函数指针是UB,然后应用的数学是UB。

char *甚至可能太小而无法编码函数指针。