gpt4 book ai didi

c - 可变长度数组和灵活数组成员之间有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 16:11:09 26 4
gpt4 key购买 nike

我在 ISO C99 committee draft 中看到过结构可以有一个不完整的数组,其末尾未指定大小,称为灵活数组成员。

另一方面,C99 也有可变长度数组,它允许在编译时声明大小不是常量的数组。

我认为 FAM 是一种特殊的 VLA,但我看到两个 SO 用户不这么认为。另外,阅读 Wikipedia section on sizeof ,它表示 sizeof 对这两者的行为不同。

为什么它们都存在而不是只有一个? (他们的用例是否差异太大?)

此外,还有哪些其他相关行为对于它们中的每一个都是不同的?

最佳答案

C99 标准添加了两种不同的东西,它们很容易被错误地混淆:

灵活的数组成员。这意味着结构的末尾可以有一个未知大小的成员。来自 C 标准的示例:

    struct s { int n; double d[]; };

int m = /* some value */;
struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));

这也在 C99 之前使用过,但它是未定义的行为,在另一个答案中被称为“struct hack”。在 C90 之前,结构末尾可能会有意外的填充字节,从而导致错误。

可变长度数组 (VLA)。这些是在运行时设置大小的数组。它们很可能是由编译器使用动态内存分配实现的。示例:

void func (int n)
{
int array[n];
}

来自 user29079 : https://softwareengineering.stackexchange.com/questions/154089/c-flexible-arrays-when-did-they-become-part-of-the-standard

关于c - 可变长度数组和灵活数组成员之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33978757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com