gpt4 book ai didi

c - 如何在 C 中使用灵活的数组来保留多个值?

转载 作者:太空宇宙 更新时间:2023-11-04 05:10:18 24 4
gpt4 key购买 nike

我有以下代码:

typedef struct
{
int name;
int info[1];
} Data;

然后我有五个变量:

int a, b, c, d, e;

如何将其用作灵活数组来保留五个变量的所有值?

最佳答案

要正确执行此操作,您应该将灵活数组成员声明为不完整类型:

typedef struct
{
int name;
int info[];
} Data;

然后为它动态分配内存

Data* data = malloc(sizeof(Data) + sizeof(int[N]));

for(int i=0; i<N; i++)
{
data->info[i] = something; // now use it just as any other array
}

编辑

确保您使用的是 C99 编译器,否则您会遇到各种问题:

如果分配一个长度为 1 的数组,那么您将为数组的第一个元素连同结构分配 1 个项目,然后在其后追加 N 个字节。这意味着您实际上是在分配 N+1 字节。这可能不是一个人想要做的,它使事情变得不必要地复杂化。

(为了解决上述问题,GCC 在 C99 之前有一个允许零长度数组的扩展,这在标准 C 中是不允许的。)

C99 之前的版本,或者在作为灵活数组成员以外的任何其他上下文中,C 不允许不完整的数组类型,如我的代码中所示。

C99 保证您的程序在使用灵活的数组成员时定义良好。如果您不使用 C99,则编译器可能会在其他结构成员和末尾的数组之间附加“结构填充”字节。这意味着 data->info[0] 可以指向结构填充字节而不是分配数组中的第一项。这可能会导致各种奇怪的、意外的行为。

这就是为什么灵活的数组成员在 C99 之前被称为“struct hack”。它们不可靠,只是一个可能有效也可能无效的肮脏黑客。

关于c - 如何在 C 中使用灵活的数组来保留多个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17344745/

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