1
2
当类型
在许多情况下,不兼容的赋值在实践中会起作用,特别是在具有“扁平”地址空间且所有指针类型共享相同内部表示形式的计算机上(例如今天所有流行的计算机)。 然而,在“混合模式”指针赋值之后,由于(1)对齐问题和(2)原因,在取消引用指针时很可能会出现问题 strict aliasing .
由于“混合模式”指针分配在形式上是非法的,而且通常是个坏主意,因此大多数编译器都会对此发出警告。大多数编译器允许使用显式强制转换来抑制警告。大多数时候,演员只是用来压制警告;它不会引入任何实际的转换,这些转换无论如何都不会执行(也就是说,改变
附录:我写道,“当
|
2
2
首先,让我们考虑不使用强制方式的赋值。C 2018 6.5.16.1 1列出了简单赋值的约束条件,其中一个必须保持。前两个用于算术、结构和联合类型。最后两个处理涉及空指针常量或
前者说只要不删除限定符,我们就可以将指针分配给兼容类型。什么是兼容类型? 6.2.7.1说明:
6.7.2.4表示每个枚举类型
6.7.3.11表示限定类型必须具有相同的限定符才能兼容。因此
6.7.6.1 2表示要使两个指针类型兼容,它们必须是指向兼容类型的同一限定指针。例如,这告诉我们
6.7.6.2 6表示要使两个数组类型兼容,它们必须具有兼容的元素类型,如果它们都具有整数常量大小,则它们必须相同(这允许具有未知大小的数组可以与已知大小的数组兼容。然而,附加的文本指出,如果数组最终具有不同的大小,那么在要求它们兼容的上下文中使用它们将具有未定义的行为。因此,将指针分配给这样的数组可能会满足其约束,并且编译时不会出错,但生成的程序可能会出现错误。) 6.7.6.3 15为函数类型的兼容性提供了一些复杂的规则。这些规则很复杂,因为函数可以用或不用参数列表、省略号等来声明。我将省略对这些问题的全部讨论。 这些规则告诉您在没有强制转换的情况下可以进行哪些指针指定。
|
Community wiki · safe_ptr实现 1 年前 |
lplplplp · 为什么不能访问函数外的结构指针 2 年前 |
Fabio · 在c中将指针赋给常数指针++ 2 年前 |
Gabe Tucker · 无法在golang中分配接口对象指针 2 年前 |