静态存储期

代码:

#include <stdio.h>
#include <stdlib.h>

void func(void);

int main(void) {

	for (int i = 0; i < 9; ++i) {
		func();
	}

	return EXIT_SUCCESS;
}

void func(void) {

	// 变量a、b均具有函数作用域

	// 自动存储期(automatic storage duration)
	int a = 0;

	// 静态存储期(static storage duration)
	// 仅在编译时初始化一次;如果不显示地对静态变量进行初始化,它们将被初始化为0
	// 本质上并不是所在函数的一个语句
	static int b = 0;

	++a;
	++b;

	printf("%d %d\n", a, b);
}

输出:

1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
时间: 2024-10-12 03:45:38

静态存储期的相关文章

标识符起作用范围----作用域、连接类型、存储期

何谓标识符? 标识符就是人为起的一个名字.c/c++中,是你用来标识变量名.符号常量名.函数名.数组名.文件名.类名.对象名等... 1.作用. 包括一下四个分类: a.代码块的作用域(存在于大括号之间) b.文件的作用域(可以说这个作用域的分类完全是为了彰显全局变量在的作用而设定的,因为全局变量可以贯穿) c.函数原型的作用域------函数声明的作用 d.函数作用域(用于goto语句使用),标志出现在函数前后都可以使用[所以即使在代码块中,但不属于代码块的作用域] 2.链接类型 a.外部链接

《征服 C 指针》摘录2:C变量的 作用域 和 生命周期(存储期)

在开发一些小程序的时候,也许我们并不在意作用域的必要性.可是,当你书写几万行,甚至几十万行的代码的时候,没有作用域肯定是不能忍受的. C 语言有如下 3 种作用域. 1.全局变量 在函数之外声明的变量,默认地会成为全局变量.全局变量在任何地方都是可见的.当程序被分割为多个源代码文件进行编译时,声明为全局变量的变量也是可以从其他源代码文件中引用的. 2.文件内部的静态变量 就算对于像全局变量那样被定义在函数外面的变量,一旦添加了 static,作用域就只限定在当前所在的源代码文件中.通过 stat

c语言 作用域、存储期、链接属性汇总

1.作用域 块作用域:用{}阔起来的,从声明开始到"}" 结束 函数作用域:goto(标识符) 的作用域为整个函数. 函数原型作用域:函数声明开始,函数声明结束而结束 文件作用域:整个文件或者程序 2.链接 无链接:即只在其作用域内可见 内链接:即在从声明到文件结束都是可见的 外链接 :多个文件或者整个程序都可见 3.存储期 静态存储期:在整个程序都是占有内存的 线程存储期:thread_local,其声明后会给每个线程分配一个单独的私有备份 自动存储期:局部变量通常都自动为auto

栈,堆,静态存储区

1.栈是先入后出, 2.栈保存了一个函数调用所需的维护信息,函数参数,函数返回地址,局部变量,函数调用上下文.没有栈就没有函数,没有局部变量. 3. 栈保存了一个函数调用所需的维护信息(函数参数,函数返回值地址,局部变量,函数调用上下文) 4.栈上的数据在函数返回后就会被释放掉,无法传递到函数外部 5.堆是程序中一块巨大的内存空间,可由程序自由使用 6.堆中被程序申请使用的内存在程序主动释放前将一直有效 7.堆空间通过申请才能获得 8.系统对堆空间的管理方式(空闲链表法,位图法,对象池法等等)

C++局部变量、全局变量、静态变量(堆、栈、静态存储区)

1 static关键字 1.1 隐藏 eg: //a.c文件中 char a = 'A'; void msg() { printf("Hello\n"); } //main.c文件中 extern char a; printf("%c",a); 输出结果:A Hello 所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问.a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的. 如果加了stat

C++中的数据存储方式自动存储、静态存储和动态存储

C++中变量存储方式有三种,自动存储,静态存储,动态存储 自动存储简单意义上就是在函数内不用任何关键字直接定义的变量,它在函数被调用时被创建,在函数退出时自动消失, 静态存储顾名思义就是在程序的整个运行过程中都存在,在函数体外定义的变量自动为静态存储方式,也可以在函数内使用static关键字定义 动态存储是以关键字new和delete构成的,在程序运行过程中需要时通过new现场分配指定大小的空间,不再需要时使用delete来释放

常量字符串为什么位于静态存储区?

char *c="zhaobei";书上说: "zhaobei"这个字符串被当作常量而且被放置在此程序的内存静态区.那一般的int i=1;1也是常量,为什么1就不被放置在此程序的内存静态区了呢?请高手指点! 所有的字符窜常量都被放在静态内存区因为字符串常量很少需要修改,放在静态内存区会提高效率 例: char str1[] = "abc";char str2[] = "abc"; const char str3[] = &q

堆区、栈区和静态存储区详解

一.内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区.堆区和栈区.他们的功能不同,对他们使用方式也就不同. 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量. 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. 堆区:亦称动态内存分配.程序在运行的时候用malloc或new申请任意大小的内存,程

(转)C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

程序在内存有五个存在区域: A:动态区域中的栈区  B:动态区域中的栈区 C:静态区域中:全局变量 和静态变量    (这个区域又可以进一步细分为:初始化的全局变量和静态变量    以及    未初始化的全局变量和静态变量  ) D:静态区域中:文字 数字 常量 E:静态区域中:代码区(就是编译后的二进制代码  指导CPU怎么运行的玩意) ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× 栈,程