可变长度数组在C中是如何对齐的?

可变长度数组在C中是如何对齐的?,c,C,C99中使用什么逻辑来对齐可变长度阵列(VLA) 我正在考虑在堆栈上为具有未知对齐要求的任意对象分配存储,因此需要最严格的对齐。我宁愿避免使用alloca(),而使用(char)VLA,因为它们更标准化 我对GCC的测试没有成功地证明它们在小于16字节的任何位置对齐。VLA的对齐方式与普通数组相同 这意味着,如果您想直接访问该整数,则分配chars数组并将int存储到其中是行不通的 您可以使用\u Alignof来确定类型的对齐方式,并手动计算所需的调整,但即使这样,它的实现也最多只能定义 我相

C99中使用什么逻辑来对齐可变长度阵列(VLA)

我正在考虑在堆栈上为具有未知对齐要求的任意对象分配存储,因此需要最严格的对齐。我宁愿避免使用
alloca()
,而使用(
char
)VLA,因为它们更标准化


我对GCC的测试没有成功地证明它们在小于16字节的任何位置对齐。

VLA的对齐方式与普通数组相同

这意味着,如果您想直接访问该整数,则分配
char
s数组并将
int
存储到其中是行不通的

您可以使用
\u Alignof
来确定类型的对齐方式,并手动计算所需的调整,但即使这样,它的实现也最多只能定义


我相信您可能必须禁用编译器上的严格别名才能正常工作。

我想,内存对齐不是C标准的一部分。请使用
malloc
并避免此类实验。为什么需要VLA而不是malloc?它看起来像“现代语言”?如果这是原因-请使用Python、Perl等,我确信您不能依赖于字符数组的对齐方式。尝试使用-Os编译以减小大小,并尝试其他编译器和其他平台。@ceving,您的猜测只是wrong@spbnick:很少有标准要求超出必要范围,因为有人认为超出范围的要求更容易实施。一个实现可以自由地进行比必要时更严格的调整,但也可以自由地只提供所需的调整,无论这对实现者来说是否是更多的工作。谢谢。你能提供一些证据来证明这一点吗?是的,我不知道类型,我只知道尺寸。嗯,实际上我可以在类型描述中添加对齐方式,但最好避免这种情况。@spbnick,C标准是这么说的
\u Alignof
\u Alignas
已随C11一起引入,因此您需要一个支持此版本的编译器。@spbnick遗憾的是,很难找到简洁且具体的引用,由于VLA未在C标准的校准部分中具体提及。您能否将字符VLA与
intmax\u t
长双精度
void*
组合在一起?这可能是相当大的一致性。也许可以为union添加一个函数指针类型,以便更好地度量!