7

据我了解 5.2.9 静态转换中的措辞,唯一一次void*允许对象指针转换void*的结果是首先是逆转换的结果。

在整个标准中,有一堆对指针表示的引用,指针的表示与void指针的表示相同char,依此类推,但似乎从未明确地说强制转换任意void指针会产生指针到内存中的同一位置,具有不同的类型,很像类型双关是未定义的,其中不双关回到对象的实际类型。

因此,虽然malloc清楚地返回了合适内存的地址等,但据我所见,似乎没有任何方法可以实际使用它,可移植。

4

3 回答 3

3

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 
于 2010-04-10T18:38:29.647 回答
2

C++03,§20.4.6p2

内容与标准 C 库头文件 <stdlib.h> 相同,但有以下更改:[此处不适用的更改列表]

C99,§7.20.3.3p2-3

(虽然 C++03 是基于 C89 的,但我只有 C99 可以引用。但是,我相信这部分在语义上没有变化。§7.20.3p1 也可能有用。)

malloc 函数为大小由 size 指定且值不确定的对象分配空间。

malloc 函数返回空指针或指向已分配空间的指针。

从这两个引号中,malloc 分配一个未初始化的对象并返回一个指向它的指针,或者返回一个空指针。作为 void 指针的指向对象的指针可以转换为指向该对象的指针(C++03 §5.2.9p13 的第一句,在上一个答案中提到)。


这应该不像你抱怨的那样“挥手”,但有人可能会争辩说我是在“解释”C 对 malloc 的定义,例如,注意到 C 说“分配的空间”而不是“分配给分配的对象”。对那些人:首先要意识到“空间”和“对象”在 C 中是同义词,其次请向标准委员会提交缺陷报告,因为即使我也不够迂腐,无法继续。:)

我将为您提供怀疑的好处,并相信您在标准之间的交叉引用、交叉解释和有时混淆的集成中被绊倒了,而不是“空间”与“对象”。

于 2011-01-18T16:04:26.163 回答
1

在整个标准中,有很多对指针表示的引用,并且void 指针的表示与 char 指针的表示相同

确实是的。

因此,虽然 malloc 清楚地返回了合适内存的地址等,但据我所见,似乎没有任何方法可以实际使用它,可移植。

当然有:

无效 *vp = malloc (1);
字符 *cp;
memcpy (&cp, &vb, sizeof cp);
*cp ='';

有一个小问题:它不适用于任何其他类型。:(

于 2011-12-13T14:20:29.387 回答