2010-03-15 58 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空間與結構本身的一部分,你減去一個從你真正想要的號碼獲得添加到分配的空間。