【发布时间】:2018-02-01 11:23:19
【问题描述】:
这是对this question的跟进。
在解释我的问题时,我声明分配的内存可以重复使用,因为它没有声明类型,并且我被告知这是不正确的 C。
这是一个说明问题的代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
struct Elt {
int id;
char name[32];
};
struct Elt2 {
double val;
char name[16];
};
static_assert(sizeof(struct Elt2) < sizeof(struct Elt), "Incorrect sizes");
int main() {
struct Elt actual1 = { 1, "foo"};
struct Elt2 actual2 = {2.0, "bar"};
struct Elt* elt = malloc(sizeof(struct Elt));
memcpy(elt, &actual1, sizeof(*elt)); // populates the allocated memory
printf("elt: %d %s\n", elt->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,或复制为字符类型的数组,则为有效类型 该访问的修改对象以及不修改该访问的后续访问 value 是从中复制值的对象的有效类型(如果有的话)。
附注 87:
87) 分配的对象没有声明类型。
问题:
是否重用分配的内存来存储不同的对象可以适合该内存符合C?
【问题讨论】:
-
“分配的内存可以被重用,因为它没有声明类型,我被告知它是不正确的 C。” 我没有找到任何人会说或暗示。
-
另外,问题是“我可以基于 malloc 编写 my_malloc”,正如 C 传统中一直期望的那样。此外,C 传统对 C 标准委员会有什么意义。 (对于 C++ 也是如此。)
标签: c memory-management malloc language-lawyer