C 同一动态分配中的两种类型

C 同一动态分配中的两种类型,c,malloc,memory-alignment,c89,C,Malloc,Memory Alignment,C89,ISO C90标准(或至少是我所拥有的草案)对malloc和校准进行了说明: 如果分配成功,则返回的指针已适当对齐,以便可以将其分配给指向任何类型对象的指针,然后用于访问分配空间中的此类对象或此类对象数组 但是,对于两种不同的类型,是否可以使用malloc返回的相同指针?例如,假设我知道sizeof(int)C90现在应该已经死了,请安息吧。这里应该考虑C99、C11和C18的行为。他们经常谈论有效类型。由于malloc分配的对象不是这样类型的,编译器将跟踪每个指针和内存区域的类型 如果将代码<

ISO C90标准(或至少是我所拥有的草案)对
malloc
和校准进行了说明:

如果分配成功,则返回的指针已适当对齐,以便可以将其分配给指向任何类型对象的指针,然后用于访问分配空间中的此类对象或此类对象数组


但是,对于两种不同的类型,是否可以使用
malloc
返回的相同指针?例如,假设我知道
sizeof(int)C90现在应该已经死了,请安息吧。这里应该考虑C99、C11和C18的行为。他们经常谈论有效类型。由于
malloc
分配的对象不是这样类型的,编译器将跟踪每个指针和内存区域的类型

如果将代码< int /c> >写入前4个字节,则编译器允许将前4个字节的数据类型视为<代码> int <代码>。如果随后对连续字节写入短字符,则其有效类型将为
short
。如果存储没有重叠,则代码正常

但是-要小心:如果您重叠了存储,即您将在
int
上写入
short
,然后读取
int
,则所有赌注都无效

最后,有一种避免歧义的相当好的方法——使用
struct
类型。就用这个怎么样

struct two_types_in_one_malloc {
    int the_int;
    short the_shorts[3];
};

我相信is@chux:为什么要删除您的答案?DR28中的要点是编译器可以优化,但C90文本中没有明确提及,因此您无法在其中找到任何相关的引用。关键是它们都指向同一个位置,在C99中被认为是有效类型的东西。但无论如何,这意味着即使两个指针重叠,编译器也可以对其进行优化,这在我的例子中是不正确的。使用分配的开头作为指向包含数组长度和容量的头的指针,这意味着数组的其余部分不再是“适当对齐,以便将其分配给指向任何类型对象的指针,然后用于访问所分配空间中的此类对象或此类对象数组”,除非您已注意确保标头的大小与所需对齐匹配。对于C11及更高版本,您可以使用
\u Alignof(max\u align\t)
来确定这一点。我要做的是创建一个动态数组类型(因此我为数组分配空间,并使用第一部分作为长度和容量的标头),但我希望它适用于所有类型,这就是为什么我不能“仅”使用结构。至于“C99,C11和C18的行为是这里应该考虑的”,我问的是C90,但是哦,好吧……那么请编辑你的问题,这样说吧!很好motivation@LeoTenenbaum