据我了解 5.2.9 静态转换中的措辞,唯一一次void*
允许对象指针转换void*
的结果是首先是逆转换的结果。
在整个标准中,有一堆对指针表示的引用,指针的表示与void
指针的表示相同char
,依此类推,但似乎从未明确地说强制转换任意void
指针会产生指针到内存中的同一位置,具有不同的类型,很像类型双关是未定义的,其中不双关回到对象的实际类型。
因此,虽然malloc
清楚地返回了合适内存的地址等,但据我所见,似乎没有任何方法可以实际使用它,可移植。
据我了解 5.2.9 静态转换中的措辞,唯一一次void*
允许对象指针转换void*
的结果是首先是逆转换的结果。
在整个标准中,有一堆对指针表示的引用,指针的表示与void
指针的表示相同char
,依此类推,但似乎从未明确地说强制转换任意void
指针会产生指针到内存中的同一位置,具有不同的类型,很像类型双关是未定义的,其中不双关回到对象的实际类型。
因此,虽然malloc
清楚地返回了合适内存的地址等,但据我所见,似乎没有任何方法可以实际使用它,可移植。
C++0x 标准草案在 5.2.9/13 中有:
“指向 cv1 void 的指针”类型的右值可以转换为“指向 cv2 T 的指针”类型的右值,其中 T 是对象类型,而 cv2 与 cv1 具有相同的 cv 限定或更高的 cv 限定。空指针值转换为目标类型的空指针值。指向对象的指针类型的值转换为“指向 cv void 的指针”并返回,可能具有不同的 cv 限定,应具有其原始值。
但还要注意,强制转换不一定会产生有效的对象:
std::string* p = static_cast<std::string*>(malloc(sizeof(*p)));
//*p not a valid object
内容与标准 C 库头文件 <stdlib.h> 相同,但有以下更改:[此处不适用的更改列表]
(虽然 C++03 是基于 C89 的,但我只有 C99 可以引用。但是,我相信这部分在语义上没有变化。§7.20.3p1 也可能有用。)
malloc 函数为大小由 size 指定且值不确定的对象分配空间。
malloc 函数返回空指针或指向已分配空间的指针。
从这两个引号中,malloc 分配一个未初始化的对象并返回一个指向它的指针,或者返回一个空指针。作为 void 指针的指向对象的指针可以转换为指向该对象的指针(C++03 §5.2.9p13 的第一句,在上一个答案中提到)。
这应该不像你抱怨的那样“挥手”,但有人可能会争辩说我是在“解释”C 对 malloc 的定义,例如,注意到 C 说“分配的空间”而不是“分配给分配的对象”。对那些人:首先要意识到“空间”和“对象”在 C 中是同义词,其次请向标准委员会提交缺陷报告,因为即使我也不够迂腐,无法继续。:)
我将为您提供怀疑的好处,并相信您在标准之间的交叉引用、交叉解释和有时混淆的集成中被绊倒了,而不是“空间”与“对象”。
在整个标准中,有很多对指针表示的引用,并且void 指针的表示与 char 指针的表示相同,
确实是的。
因此,虽然 malloc 清楚地返回了合适内存的地址等,但据我所见,似乎没有任何方法可以实际使用它,可移植。
当然有:
无效 *vp = malloc (1); 字符 *cp; memcpy (&cp, &vb, sizeof cp); *cp ='';
有一个小问题:它不适用于任何其他类型。:(