以下是official Apple Documentation of AudioBufferList
(Core Audio Data Types Reference):
AudioBufferList
保存一个可变长度的AudioBuffer结构数组。struct AudioBufferList { UInt32 mNumberBuffers; AudioBuffer mBuffers[1]; }; typedef struct AudioBufferList AudioBufferList;
字段
mNumberBuffers
mBuffers数组中AudioBuffer结构的数量。
mBuffers
一个可变长度的AudioBuffer结构数组。
如果mBuffers
定义为AudioBuffer[1]
,则其长度不可变,因此mNumberBuffers
被隐式定义为1
。
我在这里错过了什么或者这只是胡说八道吗?
答案 0 :(得分:3)
那是因为C99之前的C需要非零常量数组。
并且mBuffers
无法声明为AudioBuffer*
,因为该列表已就位。
并且mBuffers
无法声明为AudioBuffer
,因为需要mBuffers[x]
语法。
因此使用了AudioBuffer[1]
。
如果该结构仅针对C99编写,那么声明将为
struct AudioBufferList {
UInt32 mNumberBuffers;
AudioBuffer mBuffers[];
};
答案 1 :(得分:3)
这就是所谓的“struct hack”或(在C99中)称为“可变长度数组”(VLA)。基本的想法是'1'只是一个占位符。使用此结构时,可以动态分配它,为实际数据分配足够的空间。例如,如果你想要10个缓冲区,你可以分配类似的空间:
AudioBufferList *a = malloc(sizeof (*a) + 9 * sizeof(AudioBuffer));
a->mNumberBuffers = 10;
请注意,因为它为一个AudioBuffer分配空间作为结构本身的一部分,所以从你真正希望获得空间的数字中减去一个添加到分配中的空间。
答案 2 :(得分:2)
我在PostgreSQL中也看到过这种技术,虽然它总是标有评论
// VARIABLE SIZED STRUCTURE
或类似的东西。 基本上它的工作方式是结构的用户应该理解mBuffers的大小1只是初始大小。为了调整结构的大小,他们重新分配()整个事情,并假设任何内存添加到“mBuffers”列表中,“即使结构定义本身没有解释这一点。”
答案 3 :(得分:2)
据我所知,mBuffers[1]
位只是一个古老的C技巧。这允许结构的成员是可变长度数组。知道它必须是结构中的最后一个元素,因为你将写出结构的大小。
必须正确分配。或者一堆小狗会死,等等。