AudioBufferList的定义对我来说很奇怪......我猜我的C不太好
struct AudioBufferList
{
UInt32 mNumberBuffers;
AudioBuffer mBuffers[kVariableLengthArray];
};
typedef struct AudioBufferList AudioBufferList;
为什么
AudioBuffer mBuffers[kVariableLengthArray];
而不是
AudioBuffer *mBuffers;
kVariableLengthArray似乎是== 1. Eh?
我认为我有它的工作,但如果有人能让我直截了当,我会很感激。
答案 0 :(得分:3)
如果符号kVariableLengthArray
是编译时常量,这意味着您可以在堆栈上分配单个缓冲区(“自动”存储类型,在C中)。
AudioBufferList single;
single.mNumberBuffers = 1;
由于struct包含一个count,这也意味着你可以用任意数量的缓冲区创建一个实例,如下所示:
AudioBufferList * get_n_buffers(size_t num)
{
AudioBufferList *list;
if(num < 1)
return NULL;
list = malloc(sizeof *list + (num - 1) * sizeof list->mBuffers[0]);
list->mNumberBuffers = num;
return list;
}
后一代码动态分配AudioBufferList
,并依赖于数组最后的事实。因此,在内存中,它将查看AudioBuffer
是否以适当数量的AudioBuffer
实例结束,因为将分配适当的空间量。
答案 1 :(得分:0)
AudioBuffer * mBuffers;
您正在声明指向AudioBuffer的指针 在这种情况下,您需要分配足够的内存,例如使用malloc() 结构将被放置在堆上,您需要在使用后使用free()释放内存。
AudioBuffer mBuffers[ 1 ];
您正在声明一个AudioBuffer数组。内存在堆栈上自动分配。无需免费拨打电话。
因此,当它位于结构中时,更容易处理数组,因为您不需要将内存显式分配给结构成员:
AudioBufferList myBufferList;
否则,你必须这样做:
AudioBufferList myBufferList;
myBufferList.mBuffers = malloc( sizeof( AudioBuffer ) * kVariableLengthArray );
/* ... */
free( myBufferList.mBuffers );