将指向int数组的指针转换为int指针合法吗?
int arr[4];
int (*a)[4] = &arr;
int *p = (int*)a;发布于 2020-10-18 22:07:17
如果原始指针已初始化为NULL或指向int[4]的有效指针,则可以。指针转换不能违反对齐要求,以免得到UB。像我所描述的那样的浇铸不会违反这样的要求:a,a,n,f,r,t,r,t,r,n,n,g,h,h,b,b,n,g,n,i,n,i,n,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3#6#6##7#7#7#7#7#7#7#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#
如果您对指针转换感到不安(应该如此),则只需执行*a (将得到将衰减为int*的int[4] )或a[0]、&a[0][0]或&(*a)[0],就可以实现这种转换。这样,你也可以在遵守标准字母的同时取消对结果的引用。
发布于 2020-10-18 22:42:58
C 2018 6.3.2.3 7表示我们可以将int (*)[4]转换为int *
指向对象类型的指针可以转换为指向不同对象类型的指针。如果结果指针未针对引用类型正确对齐,则行为为未定义的…。
对齐必然是正确的,因为int数组必须具有int所需的对齐方式。
但是,C标准对此转换产生的值唯一的说明是:
…当再次转换回时,结果将与原始指针相比较。
这意味着int *可以暂时保存int (*)[4]的值。如果我们执行:
int arr[4];
int (*x)[4] = &arr;
int *y = (int *) x;
int (*z)[4] = (int (*)[4]) y;那么我们就知道x == z是真的,因为标准告诉我们这一点。但我们不知道y是什么。由于标准允许不同类型的指针具有不同的表示形式(使用以不同方式表示其值的位),因此y作为int *可能没有任何有用的含义。C标准没有说转换后的指针可以用来访问对象。
大多数C实现要么是有意地支持这一点,要么是作为如何设计它们的工件。然而,就C标准所指定的内容而言,不提供任何保证。
https://stackoverflow.com/questions/64418712
复制相似问题