生存期和存储类型

简介: 一、生存期二、存储类型三、寄存器变量(register)四、静态局部变量(static)五、静态局部变量(static)六、static和extern

生存期和存储类型

 

内容介绍:

一、生存期

二、存储类型

三、寄存器变量(register)

四、静态局部变量(static)

五、静态局部变量(static)

六、staticextern

 

 

一、 生存期

C语言的变量拥有两种生存期

一静态存储期(static storage duration)

一自动存储期(automatic storage duration)

 

具有文件作用域的变量属于静态存储期,函数也属于静态存储期。属于静态存储期的变量在程序执行期间将一直占据存储空间,直到程序关闭才释放。

具有代码块作用域的变量一般情况下属于自动存储期。属于自动存储期的变量在代码块结束时将自动释放存储空间。

image.png

#include <stdio.h>

int A;

static int B;

extern int C;

void func(int mint n)

{

int a, b, c;

}

int main(void)

{

int i,j,k;

return 0;

}

 

 

二、 存储类型

存储类型其实是指存储变量值的内存类型,C语言提供了5中不同的存储类型:

- auto

- register

- static

- extern

- typedef

 

 

三、自动变量( auto)

在代码块中声明的变量默认的存储类型就是自动变量,使用关键字auto来描述。

#include <stdio.h>

int main()

{

auto int i, j, k;

return 0;

}

image.png

由于这是默认的存储类型,所以不写auto是完全没问题的。

 

 

四、寄存器变量(register)

将一个变量声明为寄存器变量,那么该变量就有可能被存放于CPU的寄存器中。

寄存器变量和自动变量在很多方面的是一样的,它们都拥有代码块作用域,自动存储期和空连接属性。

不过这里有一点需要注意的是:当你将变量声明为寄存器变量,那么你就没办法通过取址运算符获得该变量的地址。

 

#include <stdio.h>

int main()

{

register int i = 520;

printf("Addr of i: %p\n"&i);

return 0;

}

运行: gcc testl.c && ./a.out

testl.c In function 'main' :

testl.c:7: error: addressof register variable ‘i' requested

发现报错

 

去掉register进行测试

#include <stdio.h>

int main()

{

int i = 520;

printf("Addr of i: %p\n"&i);

return 0;

}

运行: gcc testl.c && ./a.out

结果:Addr of i: 0xbfbd088c

就没有问题了

结论:当你将变量声明为寄存器变量,那么你就没办法通过取址运算符获得该变量的地址。

 

 

五、静态局部变量(static)

使用static来声明局部变量,那么就可以将局部变量指定为静态局部变量。

static使得局部变量具有静态存储期,所以它的生存期与全局变量一样,直到程序结束才释放。

 

#incLude <stdio.h>

void func(void) ;

void func (void);

{

static int count=0;

printf("count = %d\n",count) ;

count++

}

int main(void )

{

inti;

for(i=0;i<10;i++)

{

func();

}

return 0 ;

}

运行: gcc test2.c && ./a.out

 

结果:

count = 0

count = 1

count = 2

count = 3

count = 4

count = 5

count = 6

count = 7

count = 8

count = 9

 

 

六、staticextern

作用于文件作用域的staticextern, static关键字使得默认具有external链接属性的标识符变成internal链接属性,而extern关键字是用于告诉编译器这个变量或函数在别的地方已经定义过了,先去别的地方找找,不要急着报错。

static具有自动存储期,extern具有静态存储期

 

案例:编辑两个进行test测试

Void func();

Int  vount = 520;

Int main()

{

Func();

}

 

#include <stdio. h>

int count;

void func(void )

{

printf("count = %d\n", count);

}

运行: gcc test3.c && ./a.out

结果:count = 520

 

相关文章
|
4月前
|
存储 程序员 C语言
动态存储方式与静态存储方式
在编程中,数据的存储方式对于程序的性能、内存使用以及代码的可维护性都有着至关重要的影响。其中,动态存储方式和静态存储方式是两种常见的数据存储方式。本文将探讨这两种存储方式的区别、应用场景,并附上相应的代码示例。
107 1
|
4月前
|
存储 C++
C/C++数据类型从0到内存具体分配详解
C/C++数据类型从0到内存具体分配详解
|
4月前
|
存储 Serverless 文件存储
存储类型介绍
存储类型介绍
30 2
|
4月前
|
存储 安全 程序员
关于动态存储方式与静态存储方式的文章
关于动态存储方式与静态存储方式的文章
23 0
|
4月前
|
存储 C语言
静态存储方式
静态存储方式
92 0
|
9月前
|
存储 C#
C# “值类型“和“引用类型“在内存的分配
C# “值类型“和“引用类型“在内存的分配
|
9月前
|
C++
C和C++动态内存分配及内存注意事项(重要)
C和C++动态内存分配及内存注意事项(重要)
52 0
|
存储 C++
C++— —变量的四种存储类型
C++— —变量的四种存储类型
|
存储 编译器 C++
【C/C++知识点】变量的4种存储类型
【C/C++知识点】变量的4种存储类型
241 0
|
存储 编译器 C++
临时确保局部变量使用的内存空间
临时确保局部变量使用的内存空间
57 0