2010-03-15 62 views
3

这里是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

我在这里想念什么,或者这只是无稽之谈?

回答

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?见。)

2

这种技术是什么我也看到了在PostgreSQL中,虽然它总是标有注释

// VARIABLE SIZED STRUCTURE 

或类似的东西。 基本上,它的工作方式是,结构的用户应该明白,mBuffers的大小只是初始大小。为了调整结构的大小,他们重新分配()整个事物,并假定任何加到末尾的内存“属于”mBuffers列表,即使结构定义本身没有解释这一点。

2

从我被告知,该mBuffers[1]位只是一个旧的C招。这允许结构的成员是一个可变长度的数组。知道它必须是结构体中的最后一个元素,因为你会写过结构体的大小。

这必须正确分配。或者一群小狗会死亡等。

3

这就是所谓的“struct hack”或(在C99中)“可变长度数组”(VLA)。基本思想是'1'只是一个地方拥有者。当你使用这个结构时,你动态地分配它,为真实数据分配足够的空间。例如,如果你想10个缓冲区,你会分配空间类似:

AudioBufferList *a = malloc(sizeof (*a) + 9 * sizeof(AudioBuffer)); 
a->mNumberBuffers = 10; 

注意,因为它分配一个AudioBuffer空间与结构本身的一部分,你减去一个从你真正想要的号码获得添加到分配的空间。