我们可以重用已分配的内存

这是对这个问题的跟进。

在解释我的问题时,我声明分配的内存可以重用,因为它没有声明的类型,我被告知它是不正确的C.

这是一个说明问题的代码示例:

#include  #include  #include  #include  struct Elt { int id; char name[32]; }; struct Elt2 { double val; char name[16]; }; static_assert(sizeof(struct Elt2) id, elt->name); struct Elt2 *elt2 = (void *) elt; // declares a new pointer to a shorter type memcpy(elt2, &actual2, sizeof(*elt2)); // effective type is now struct Elt2 printf("elt2: %g %s\n", elt2->val, elt2->name); //printf("elt: %d %s\n", elt->id, elt->name); UB: storage now contains an Elt2 object free(elt); // only legal use for elt return 0; } 

我相信n1570草案的6.5表达式§6允许它:

用于访问其存储值的对象的有效类型是对象的声明类型(如果有).87)如果通过具有非字符类型的类型的左值将值存储到没有声明类型的对象中,然后左值的类型成为该访问的对象的有效类型以及不修改存储值的后续访问。 如果使用memcpy或memmove将值复制到没有声明类型的对象中,或者将其复制为字符类型数组,则该访问的修改对象的有效类型以及不修改该值的后续访问的有效类型是复制值的对象的有效类型(如果有)。

注87:

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

题:

是否重用已分配的内存来存储可以适合符合内存的 C的不同对象?

如果没有,那将是灾难性的。 许多人使用这样的技巧来实现他们对malloc细粒度内存管理。

所以,是的,这正是您引用的标准段落的内容。 请注意,它仔细地选择了这些词。 它说

如果值存储在没有声明类型的对象中……

没有声明类型的此属性在对象的生命周期内不会更改,因此该规定适用于在其中写入新值的任何时间。

如果由于一些奇怪的原因委员会想要说有效类型只能改变一次,他们就会说类似

如果将值存储到没有有效类型的对象中……

唯一正确的答案是完全源自标准的答案。

如果不通过标准,我会说,“是的,你的假设是正确的”。 我这样说是因为没有它,就不可能实现自己的内存管理器。 我认为即使没有它也可以在C中实现malloc