gpt4 book ai didi

c - 如何分配包含可变长度数组的结构?

转载 作者:太空狗 更新时间:2023-10-29 15:12:59 25 4
gpt4 key购买 nike

CoreAudio 框架使用如下声明的结构:

struct AudioBufferList
{
UInt32 mNumberBuffers;
AudioBuffer mBuffers[1]; // this is a variable length array of mNumberBuffers elements
};
typedef struct AudioBufferList AudioBufferList;

据我所知,这基本上是 AudioBuffer 结构的可变长度集合。 malloc 这种结构的“正确”方法是什么?

AudioBufferList *list = (AudioBufferList *)malloc(sizeof(AudioBufferList));

这行得通吗?

我在网上看到过各种各样的例子,比如

calloc(1, offsetof(AudioBufferList, mBuffers) +
(sizeof(AudioBuffer) * numBuffers))

malloc(sizeof(AudioBufferList) + sizeof(AudioBuffer) * (numBuffers - 1))

最佳答案

那不是变长数组;这是一个“结构黑客”。标准(自 C99 起)技术使用“灵活的数组成员”,如下所示:

struct AudioBufferList
{
UInt32 mNumberBuffers;
AudioBuffer mBuffers[]; // flexible array member
};

FAM 的优势之一是您的问题“无关紧要”;为 mBuffers 数组中的 numBuffer 元素分配空间的正确方法是:

size_t n_bytes = sizeof(struct AudioBufferList) + numBuffer * sizeof(AudioBuffer);
struct AudioBufferList *bp = malloc(nbytes);

为了回答您的问题,实际上 malloc()calloc() 都会为作业分配至少足够的空间,但在任何 C 标准中都没有保证代码会工作。话虽如此,编译器编写者知道该习惯用法已被使用,并且通常不会特意破坏它。

除非空间非常狭窄,否则使用与 FAM 相同的表达式可能是最简单的;在最坏的情况下,您分配的空间比您绝对需要分配的空间多一点。当您升级代码以使用 FAM 时,它将继续工作。 calloc() 版本中使用的表达式也适用于 FAM 成员; malloc() 版本中使用的表达式会突然分配太少的空间。

关于c - 如何分配包含可变长度数组的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22431120/

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