函数内的静态变量在程序的生命周期内只分配一次。
所以如果我有这样的功能:
void f(int n) {
static int *a = new int[n];
}
我先打电话
f(1)
进而
f(3)
第二次调用后数组 a 会有多大?
static
函数的局部变量在控制第一次通过它们时被初始化。标准中的相关部分是 6.7 [stmt.dcl]。也就是说,除非您明确更改其大小,否则数组将获取大小 1 并保持此大小。
C++ 2011 的优点在于初始化static
变量也是线程安全的:如果在初始化变量时另一个线程到达实例,则第二个线程将被阻塞,直到初始化完成。
static
当控制流第一次到达声明时,局部变量将被初始化。在这种情况下,自从您第一次用作1
参数以来n
,您将为 one 分配大小int
。
做这种事情是个坏主意。您应该只使用本地的、非静态的std::vector
或其他更高级别的容器。
函数内静态变量的初始化仅发生在函数内静态语句的第一次评估期间。第一次使用f
调用when 时f(1)
,将进行 for 的初始化,a
它将指向单个 int 的数组。当f(3)
被调用时,a
已经被初始化了,所以右手边的:
static int *a = new int[n];
不会再被求值,并且a
会继续指向最初分配的大小为 1 的数组。
数组的大小为 1,因为变量“a”的初始化只进行了一次,即第一次调用函数“f”。