假设我在C中的函数内声明了一个静态变量。
如果我多次调用该函数,那么每次调用函数时,是否会在内存中重新分配静态变量?
如果确实重新分配,为什么始终保持最后一个值?
例:
void add() { static int x = 1; x++; printf("%dn",x); } int main() { add(); // return 2 add(); // return 3 add(); // return 4 }
否 – 静态变量基本上是位于本地名称空间内的全局变量。
不,每次都不会重新分配变量。 它就像有一个全局变量,但它只有局部范围; 即,您只能从该函数内部引用它。
没有,
如何在函数调用之间保留它的价值呢?
在这方面,静态变量就像全局变量,但它们是周围范围(函数,类,命名空间)的本地变量。
每次调用函数时都不会重新分配静态变量。 它们充当正常的局部变量。 但它们的存储持续时间不同,即当函数为静态变量赋值时,该值在函数调用之间保留。
在C编程语言中,static与全局变量和函数一起使用,以将其范围设置为包含文件。 在局部变量中,static用于将变量存储在静态分配的内存中,而不是自动分配的内存中。 虽然该语言没有规定任何类型的存储器的实现,但是静态分配的存储器通常在编译时保留在程序的数据段中,而自动分配的存储器通常被实现为瞬态调用栈。
由于静态前缀表明该变量位于静态内存中,该内存包含在编译时已知地址的变量(对于全局变量来说,这是一种有点迂腐的方式)。 这与自动变量(在堆栈上分配)和动态变量(使用malloc在堆上分配)不同。
函数(或其他静态)中的静态变量的初始化在程序运行之前执行。 更确切地说,它意味着它只能是一些常量表达式,编译器可以在编译时获得。
这意味着以下程序无效:
int f(int x){ return x+1; } int main(){ static int a = f(1); return a; }
当我用gcc编译它时,它会按预期抱怨以下消息:
error: initializer element is not constant
但是,当程序运行时,您可以将静态变量的值更改为任何其他变量。
以上就是c/c++开发分享每次调用父函数时,C中的静态变量是否重新分配?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/545998.html