首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >核心-音频-构造AudioBufferList结构(Q关于c结构定义)

核心-音频-构造AudioBufferList结构(Q关于c结构定义)
EN

Stack Overflow用户
提问于 2010-04-21 18:16:21
回答 2查看 1.8K关注 0票数 2

…,AudioBufferList的定义在我看来很奇怪我想我的C不是很好

代码语言:javascript
复制
struct AudioBufferList
{
    UInt32      mNumberBuffers;
    AudioBuffer mBuffers[kVariableLengthArray];
};
typedef struct AudioBufferList  AudioBufferList;

为什么

代码语言:javascript
复制
AudioBuffer mBuffers[kVariableLengthArray];

而不是

代码语言:javascript
复制
AudioBuffer *mBuffers;

kVariableLengthArray似乎是== 1。嗯?

我想我有它的工作,但如果有人能纠正我,我将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-21 19:13:00

如果符号kVariableLengthArray是编译时常量,这意味着您可以在堆栈上分配单个缓冲区(C中的“自动”存储类型)。

代码语言:javascript
复制
AudioBufferList single;

single.mNumberBuffers = 1;

由于该结构包含一个计数,这也意味着您可以创建一个具有任意数量缓冲区的实例,如下所示:

代码语言:javascript
复制
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实例结束。

票数 4
EN

Stack Overflow用户

发布于 2010-04-21 18:48:33

代码语言:javascript
复制
AudioBuffer * mBuffers;

您正在声明一个指向AudioBuffer的指针

在这种情况下,您需要分配足够的内存,例如使用malloc()。

结构将被放在堆上,使用后需要使用free()释放内存。

代码语言:javascript
复制
AudioBuffer mBuffers[ 1 ];

您声明的是一个AudioBuffer数组。内存是在堆栈上自动分配的。不需要拨打免费电话。

因此,当它在结构中时,处理数组更容易,因为您不需要显式地为结构成员分配内存:

代码语言:javascript
复制
AudioBufferList myBufferList;

否则,您必须执行以下操作:

代码语言:javascript
复制
AudioBufferList myBufferList;
myBufferList.mBuffers = malloc( sizeof( AudioBuffer ) * kVariableLengthArray );
/* ... */
free( myBufferList.mBuffers );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2681983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档