您提供的代码:
static const int kFrameCountSample = 250;
static float samples[kFrameCountSample];
无效 C。具有静态存储持续时间的对象不能具有可变修改类型。另一方面,这将是有效的:
#define kFrameCountSample 250
static float samples[kFrameCountSample];
这在文件范围或函数范围内都有效。在这两种情况下,数组samples
都具有静态存储持续时间,这意味着它在程序的整个生命周期中都存在,并且仅在程序启动时初始化一次。唯一的区别是,如果它在函数中,则名称的范围samples
仅限于声明它的块。在这两种情况下,它都不可能在堆栈上分配。
samples
这里的数组是零初始化的 -具有静态存储持续时间的对象永远不会 uninitialized。如果您不提供显式初始值设定项,它们将被初始化为相应类型的零。
如果您确实希望将数组存储在堆栈上 - 也就是说,在输入包含声明的函数时创建并在退出该函数时销毁,C 称为自动存储持续时间- 那么您必须在函数中声明它,省略static
关键字并添加一个显式初始化程序:
float samples[kFrameCountSample] = { 0 };
(在这种情况下kFrameCountSample
不需要是一个宏,static const int
如果你愿意,它可以是一个)。
{ 0 }
无论数组大小,单个都可以,因为 C 中的对象永远不会部分初始化 - 如果您初始化数组或结构的任何子对象,其余子对象将被初始化为零的适当类型,就像具有静态存储持续时间的对象。