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