【问题标题】:Strict aliasing rules for allocated objects分配对象的严格别名规则
【发布时间】:2012-11-23 07:33:07
【问题描述】:

C99 6.5/6 访问其存储的对象的有效类型 value 是对象的声明类型,如果有的话。 75)

如果一个值通过 lvalue 的类型不是字符类型,然后是 左值成为该访问的对象的有效类型 以及不修改存储值的后续访问。

如果一个值被复制到一个没有声明类型的对象中 memcpy 或 memmove,或复制为字符类型数组,则 该访问的修改对象的有效类型和 不修改值的后续访问是有效类型 从中复制值的对象的名称(如果有的话)。对所有人 对没有声明类型的对象的其他访问,有效 对象的类型只是用于 访问。

75) 分配的对象没有声明类型。

如 C99 中所述,静态对象的有效类型是它们声明的类型。

分配的对象如何获得它们的有效类型?

例如:

int *p = malloc(100 * sizeof(int));

为什么它们没有以声明类型开头?

【问题讨论】:

  • 第二段,以“如果将值存储到没有声明类型的对象中”开头的段落准确地回答了您的问题。

标签: c types c99


【解决方案1】:

分配的对象没有任何声明的类型,所以它的有效类型是用于访问的左值的类型。使用这一条语句,p 没有有效类型:

#include <stdlib.h>
int *p = malloc(100 * sizeof(int));

否则,将有一个与下一次访问:

/* Effective type of p: unsigned int */
*(unsigned int *)p = 20U;

【讨论】:

  • 最后说and for subsequent accesses that do not modify the stored value 是不是有了有效类型就不能修改值什么的了?
  • 如果后续访问修改了存储的值,是否会再次变为未声明有效类型?
  • @VilhelmGray:如果后续访问修改了存储的值,则有效类型将变为该访问所暗示的任何内容,如果有的话。如果访问不会建立新的声明类型,则对象将返回没有有效类型(因此可用作任何类型)。然而,标准是一团糟,因为使用字符指针类型编写会有效地擦除有效类型,除非编译器感知到正在复制字符数组(在这种情况下有效类型被复制)。然而,标准中没有明确说明这意味着什么。
猜你喜欢
  • 2015-10-15
  • 2017-02-25
  • 2013-03-11
  • 2018-12-14
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
相关资源
最近更新 更多