【发布时间】:2014-09-02 12:03:37
【问题描述】:
我读到将指向一个类型的指针分配给指向另一个类型的另一个指针是非法的;例如,在本书中:
C 如何编程 7 ed。页。 299
常见编程错误 7.7 将一种类型的指针分配给 如果两者都不是 void * 类型,则另一种类型的指针是一种语法 错误。
或者在这个URL:
但是在 C11 标准中是这样写的:
指向对象类型的指针可以转换为指向对象类型的指针 不同的对象类型。如果结果指针不正确 为引用类型对齐,则行为未定义。 否则,当再次转换回来时,结果将比较相等 到原来的指针。
所以我明白,只有当存在对齐问题时,行为才会被定义。
事实上,像 GCC 4.8 或 cl 2013 这样的编译器只会发出来自不兼容指针类型的赋值警告。
空指针不存在该异常。
所以:
int a = 10;
float b = 100.22f;
int *p_a = &a;
float *p_f = &b;
p_a = p_f; // NOT ILLEGAL but WARNING
p_f = p_a; // converted back again. it still works
void *v_p = p_a; // NOT ILLEGAL NO WARNING
p_a = v_p; // converted back again. it still works
我理解得好吗?还是我错过了什么?
附: 还有谁能给我看一个“对齐问题”的例子吗?
【问题讨论】:
-
也许您可以告诉我们这些“很多书”是什么,以及它们实际上在说什么?以及您使用的是什么版本的 gcc,以及它给出的警告。并告诉我们您对对齐做了哪些研究,以及您不了解哪些方面。
-
@Useless,我不明白将指向类型的指针分配给指向另一种类型的指针是合法的还是不像 void * 那样。对于标准,它似乎理解它是合法的......
-
如果书中说将指针分配给另一个不同类型的指针是“语法错误”,那么这本书是错误的!
-
我认为那是Deitel & Deitel 的书?无论如何,这显然是错误的。