在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.多么奇怪的黑客.
在C中,声明一个元素作为结构成员的数组当然是合法的.访问元素0之外的元素不是非法的(在某种意义上,编译器不需要将其诊断为错误),但这样做具有未定义的行为.但由于它是一种常见的习惯用法,称为"结构黑客",只要你分配足够的内存来容纳其他元素,它就很有可能发挥作用.
1999 ISO C标准添加了一个新功能,即灵活的阵列成员,旨在取代结构黑客,但具有明确定义的行为.使用空方括号声明灵活的数组成员[].
C++中的情况类似 - 除了C++从未采用灵活的数组成员.(C++的通常建议是使用一些容器类(例如vector)而不是原始数组.
comp.lang.c FAQ的问题2.6 讨论了struct hack.