首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >铸造int (*a)[4]至int *p

铸造int (*a)[4]至int *p
EN

Stack Overflow用户
提问于 2020-10-18 21:52:34
回答 2查看 83关注 0票数 1

将指向int数组的指针转换为int指针合法吗?

代码语言:javascript
复制
int arr[4];
int (*a)[4] = &arr; 
int *p = (int*)a;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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],就可以实现这种转换。这样,你也可以在遵守标准字母的同时取消对结果的引用。

票数 1
EN

Stack Overflow用户

发布于 2020-10-18 22:42:58

C 2018 6.3.2.3 7表示我们可以将int (*)[4]转换为int *

指向对象类型的指针可以转换为指向不同对象类型的指针。如果结果指针未针对引用类型正确对齐,则行为为未定义的…。

对齐必然是正确的,因为int数组必须具有int所需的对齐方式。

但是,C标准对此转换产生的唯一的说明是:

…当再次转换回时,结果将与原始指针相比较。

这意味着int *可以暂时保存int (*)[4]的值。如果我们执行:

代码语言:javascript
复制
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标准所指定的内容而言,不提供任何保证。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64418712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档