通过指向int的指针别名char数组是否合法?

chbaker0

我知道标准中明确允许以下内容:

int n = 0;
char *ptr = (char *) &n;
cout << *ptr;

那这个呢?

alignas(int) char storage[sizeof(int)];
int *ptr = (int *) &storage[0];
*ptr = 0;
cout << *ptr;

本质上,我在问别名规则是否允许通过指向另一种类型的指针来访问字符序列。如果可能,我希望引用该标准的各个部分,以指示一种或另一种方式。

标准的某些部分使我产生了冲突。(3.10.10)似乎表明它的动态类型storage为not ,这将是未定义的行为int但是,动态类型的定义对我来说还不清楚,并且存在的存在std::aligned_storage会让我相信这可能的。

MM

该代码int *ptr = (int *) &storage[0]; *ptr = 0;通过违反严格的别名规则(C ++ 14 [basic.lval] / 10)导致未定义的行为

被访问的对象具有type,char但用于访问的glvalue具有type int

的“对象的动态类型”char仍然是char在派生类的情况下,动态类型仅与静态类型不同)。C ++也没有C的“有效类型”的等效项,它允许通过使用赋值运算符到malloc的空间中来“创建”类型化的对象。


关于的正确使用std::aligned_storage,您应该使用newplacement在存储中创建一个对象。可以考虑使用new-placeing来结束char(或任何其他)对象的生命周期,并创建指定类型的(动态存储持续时间)新对象,并重新使用同一存储。这样就不会出现严格的别名冲突。

您可以对char数组执行相同的操作,例如:

alignas(int) char storage[sizeof(int)];
int *ptr = new(storage) int;
*ptr = 0;
cout << *ptr;

请注意,delete内置type不需要伪析构函数调用或int如果使用具有非平凡初始化的类类型,则需要这样做。链接到进一步阅读

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

指向int和char的指针(数组)

将指向数组开头的指针与指向数组开头之前的相同类型的指针进行比较是否合法?

指向char或char数组的指针

指向char的指针与指向数组的指针

是否在C中的结构内返回指向char数组的指针?

指向char数组的指针数组的指针

别名结构和数组是否合法?

关于指向char的指针数组

指向char数组的指针问题

指向int的const数组的指针

将char指向char数组的指针

C * char指向char数组的指针

将指向部分构造对象的指针转换为指向基类的指针是否合法?

从指向其第二个成员的指针获取指向结构的指针是否合法?

char Vs的指针数组int的指针数组

指向char数组的指针,未处理的异常

如何增加指向char数组的指针的位置?

指向 int == 指向 char 的指针(有点)?

C ++ int指向数组的指针指向数组内存泄漏

管理指向int数组的指针的问题

是否需要创建指向结构的指针数组?

不知道如何实现指向char指针数组的指针

是否通过指向第一个元素UB的指针访问多维数组的中间?

是否可以通过Ctypes使用指向3dim数组的指针来调用C DLL?

通过void修改任何数据指针是否合法**

当它实际上未指向char数组时,是否将其添加到“ char *”指针UB?

const指向成员的指针默认是否指向int?

将指针传递给需要数组的函数是否合法?

严格的别名是否会阻止您通过其他类型写入char数组?