这有什么意义吗(Apple文档)?

时间:2010-03-15 19:02:55

标签: core-audio

以下是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

我在这里错过了什么或者这只是胡说八道吗?

4 个答案:

答案 0 :(得分:3)

那是因为C99之前的C需要非零常量数组。

并且mBuffers无法声明为AudioBuffer*,因为该列表已就位。

并且mBuffers无法声明为AudioBuffer,因为需要mBuffers[x]语法。

因此使用了AudioBuffer[1]

如果该结构仅针对C99编写,那么声明将为

struct AudioBufferList {
    UInt32      mNumberBuffers;
    AudioBuffer mBuffers[];
};

(另见Is using flexible array members in C bad practice?。)

答案 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技巧。这允许结构的成员是可变长度数组。知道它必须是结构中的最后一个元素,因为你将写出结构的大小。

必须正确分配。或者一堆小狗会死,等等。