首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何指定指向未对齐整型的指针?

如何指定指向未对齐整型的指针?
EN

Stack Overflow用户
提问于 2015-08-17 20:46:00
回答 3查看 1.3K关注 0票数 1
代码语言:javascript
复制
struct Intx4 {
  int data[4];
};

Intx4 loadIntx4(void const *p) {
  auto up alignas(1) = (int const *)p; // Does this line correct? (compiled ok in clang)
  Intx4 r;
  for (int i = 0; i < 4; i++) r.data[i] = up[i];
  return r;
}

我还尝试了以下代码,它们都无法在clang中编译:

代码语言:javascript
复制
int const *up alignas(1) = (int const *)p;
auto up = (int const alignas(1) *)p;
EN

回答 3

Stack Overflow用户

发布于 2015-08-17 21:27:41

要读取未对齐整数,请执行以下操作:

代码语言:javascript
复制
int i;
void* ptr_to_unaligned;
...
memcpy (&i, ptr_to_unaligned, sizeof(i));

C++中没有未对齐的整数类型,所以只能凑合使用void*

票数 4
EN

Stack Overflow用户

发布于 2015-08-17 21:29:13

根据C++11草案(n4296),尝试将空指针转换为具有对齐要求的类型会调用未定义的行为

从5.2.9静态转换§13:“指向cv1空的指针”类型的Pr值可以转换为“指向cv2 T的指针”类型的Pr值,其中T是对象类型,cv2是与cv1相同或更高的cv限定...如果原始指针值表示内存中一个字节的地址A,并且A满足T__的对齐要求,则产生的指针值表示与原始指针值相同的地址,即A。任何其它此类指针转换的结果未指定(强调我的)

我知道您正在使用显式转换(或C风格的转换),但是5.4显式转换说明:由const_cast (5.2.11)、static_cast (5.2.9)、static_cast后跟const_cast、reinterpret_cast (5.2.10)或reinterpret_cast后跟const_cast执行的转换可以使用显式类型转换的cast表示法来执行。同样的语义限制和行为也适用于...

因此,在您的示例中,显式类型转换与static_cast<int const *>(p)相同。

一些体系结构,特别是ARM体系结构,在尝试访问that other SO answer中所说的未对齐的整型指针时会陷入陷阱

票数 3
EN

Stack Overflow用户

发布于 2018-09-08 20:55:17

要以未对齐的方式使用整数,请将单词__packed放在整数指针声明的前面:

代码语言:javascript
复制
__packed int *pi; // pointer to unaligned int

Unaligned pointers in C and C++ code

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

https://stackoverflow.com/questions/32050802

复制
相关文章

相似问题

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