您的位置:首页 > 编程语言 > C语言/C++

关于static静态变量的理解以及C中的内存区的分配

2016-10-07 15:57 886 查看
static静态变量

1、局部变量:在一个函数中,定义一个static的静态变量,它是存储在静态存储区。该变量只是在该函数第一次运行时完成初始化,若再次在调用这个函数,它不会再执行这句语句。它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。

#include <stdio.h>
int display()
{
static von = 10;
von--;
return(von);
}

main()
{
int i;
for(i=0;i<10;i++)
{
printf("\r\n%d\r\n",display());
}
}


这个程序的输出结果为:

9

8

7

6

5

4

3

2

1

0

2、全局变量:静态全局变量和非静态的全局变量。两种变量都是静态存储方式。          ①非静态全局变量:作用域为整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。②静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它,它不能extern到其他源文件。
3、静态函数(内部函数):在函数的返回类型前加上关键字static,函数就别定义为静态函数。函数定义和声明在默认情况下是extern的,但是静态函数只是在声明它的文件中可见,该函数的作用仅限于本.c文件。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。


C中的内存区的分配

1、栈-由编译器自动分配、释放。

2、堆-由程序员分配、释放。若程序员不释放,程序结束时候有操作系统自动回收。

3、全局/静态存储区:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

4、专门存放常量的区域。

//main.cpp
int a = 0;      // 全局初始化区
char *p1;      // 全局未初始化区
void main()
{
int b;            // 栈区
char s[] = "abc"; // 栈区
char *p2; // 栈区
char *p3 = "123456"; // p3在栈区;   "123456\0" 在常量区,

static int c =0;      // 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); // 分配得来的10和20字节的区域就在堆区
strcpy(p1, "123456");    // "123456\0" 放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}


引用: http://www.cnblogs.com/JCSU/articles/1051579.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息