代码之家  ›  专栏  ›  技术社区  ›  bastibe

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

  •  3
  • bastibe  · 技术社区  · 14 年前

    这是一段 official Apple Documentation of AudioBufferList (Core Audio Data Types Reference) :

    音频缓冲表
    保存音频缓冲区结构的可变长度数组。

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

    领域

    mNumberBuffers
    mbuffer数组中音频缓冲区结构的数目。

    mBuffers
    音频缓冲区结构的可变长度数组。

    如果 缓冲区 定义为 AudioBuffer[1] 它的长度不是可变的,因此 mNumerBuffers数缓冲区 被隐式定义为 1 .

    我是错过了什么,还是这只是胡说八道?

    4 回复  |  直到 11 年前
        1
  •  3
  •   Community Bayu Bramantya    7 年前

    这是因为c99之前的c需要一个非零的常量数组大小。

    mBuffers 不能声明为 AudioBuffer* ,因为列表已就位。

    缓冲区 不能声明为 AudioBuffer ,因为 mBuffers[x] 需要语法。

    所以 AudioBuffer[1] 使用。

    如果该结构仅为c99编写,那么声明将是

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

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

        2
  •  3
  •   Jerry Coffin    14 年前

    这就是所谓的“结构黑客”或(在C99中)可变长度数组(VLA)。基本的想法是“1”只是一个地方持有者。当您使用这个结构时,您可以动态地分配它,为实际数据分配足够的空间。例如,如果您需要10个缓冲区,您可以分配如下空间:

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

    注意,由于它为一个audiobuffer分配空间作为结构本身的一部分,所以从您真正想要得到的空间添加到分配中的数字中减去一个。

        3
  •  2
  •   Steven Schlansker    14 年前

    这是我在PostgreSQL中也见过的一种技术,尽管它总是用注释来标记。

    // VARIABLE SIZED STRUCTURE
    

    或者类似的。 基本上,它的工作方式是期望结构的用户理解mbuffer的大小1只是初始大小。为了调整结构的大小,他们重新分配()整个内容,并假设附加到末尾的任何内存“属于”mbuffer列表,即使结构定义本身没有解释这一点。

        4
  •  2
  •   Rev316    14 年前

    据我所知, mBuffers[1] 比特只是一个古老的C技巧。它允许结构的成员是可变长度数组。知道它必须是结构中的最后一个元素,因为您将写入超过结构的大小。

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