这个数组如何合法?

bob*_*obo 1 c c++ arrays

CoreAudioTypes.h中,有以下声明:

struct AudioBuffer
{
    UInt32  mNumberChannels;
    UInt32  mDataByteSize;
    void*   mData;
};
typedef struct AudioBuffer  AudioBuffer;

/*!
    @struct         AudioBufferList
    @abstract       A variable length array of AudioBuffer structures.
    @field          mNumberBuffers
                        The number of AudioBuffers in the mBuffers array.
    @field          mBuffers
                        A variable length array of AudioBuffers.
*/
struct AudioBufferList
{
    UInt32      mNumberBuffers;
    AudioBuffer mBuffers[1]; // this is a variable length array of mNumberBuffers elements
} ;
typedef struct AudioBufferList  AudioBufferList;
Run Code Online (Sandbox Code Playgroud)

我的问题涉及到mBuffers成员AudioBufferList.它们将它声明为一个大小为1的数组,但它的使用方式就好像是(任何大小)一样mNumberBuffers.

在C和C++中这不是非法的(代码应该兼容)吗?

这段代码:

int m[1];
m = new int[ 40 ] ;
Run Code Online (Sandbox Code Playgroud)

在C++中不起作用,那么它给出了什么?

编辑

这是用法:

bufferList = (AudioBufferList *)malloc(
  sizeof (AudioBufferList) + sizeof (AudioBuffer) * (channelCount - 1) ) ;
Run Code Online (Sandbox Code Playgroud)

所以,用下面的答案解释本,尺寸1的阵列存在的作用就像一个数组..但也有超过1个元件(一个或多个)所述阵列中mBuffers.多么奇怪的黑客.

Kei*_*son 6

在C中,声明一个元素作为结构成员的数组当然是合法的.访问元素0之外的元素不是非法的(在某种意义上,编译器不需要将其诊断为错误),但这样做具有未定义的行为.但由于它是一种常见的习惯用法,称为"结构黑客",只要你分配足够的内存来容纳其他元素,它就很有可能发挥作用.

1999 ISO C标准添加了一个新功能,即灵活的阵列成员,旨在取代结构黑客,但具有明确定义的行为.使用空方括号声明灵活的数组成员[].

C++中的情况类似 - 除了C++从未采用灵活的数组成员.(C++的通常建议是使用一些容器类(例如vector)而不是原始数组.

comp.lang.c FAQ的问题2.6 讨论了struct hack.