生存期和存储类型|学习笔记

简介: 快速学习生存期和存储类型

开发者学堂课程【你的第一门 C 语言课生存期和存储类型】学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/444/detail/5481


生存期和存储类型


内容介绍:

一、 生存期

二、 存储类型

三、 寄存器变量(register)

四、 静态局部变量(static)

五、 静态局部变量(static)

六、 static 和 extern


一、 生存期

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

一静态存储期(static storage duration)

一自动存储期(automatic storage duration)

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

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

图片54.png

#include

int A;

static int B;

extern int C;

void func(int m,int n)

{

int a, b, c;

}

int main(void)

{

int i,j,k;

return 0;

}


二、存储类型

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

- auto

- register

- static

- extern

- typedef

 

三、自动变量( auto)

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

#include

int main()

{

auto int i, j, k;

return 0;

}

图片55.png

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

 

四、寄存器变量(register)

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

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

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

 #include

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

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

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


六、static 和 extern

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

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

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

Void func();

Int  vount = 520;

Int main()

{

Func();

}

#include

int count;

void func(void )

{

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

}

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

结果:count = 520

相关文章
|
5月前
|
存储 程序员 C语言
动态存储方式与静态存储方式
在编程中,数据的存储方式对于程序的性能、内存使用以及代码的可维护性都有着至关重要的影响。其中,动态存储方式和静态存储方式是两种常见的数据存储方式。本文将探讨这两种存储方式的区别、应用场景,并附上相应的代码示例。
135 1
|
5月前
|
存储 C++
C/C++数据类型从0到内存具体分配详解
C/C++数据类型从0到内存具体分配详解
|
1月前
|
存储 缓存 程序员
c语言的存储类型-存储类
本文详细介绍了C语言中的存储类型及其分类,包括基本类型(如整型、浮点型)和复合类型(如数组、结构体)。重点讲解了不同存储类别(`auto`、`static`、`register`、`extern`、`typedef`、`volatile`、`const`)的特点及应用场景,并展示了C11/C99引入的新关键字(如`_Alignas`、`_Atomic`等)。通过示例代码解释了每个存储类别的具体用法,帮助读者更好地理解和运用这些概念。
|
5月前
|
存储 安全 程序员
关于动态存储方式与静态存储方式的文章
关于动态存储方式与静态存储方式的文章
25 0
|
5月前
|
存储 C语言
静态存储方式
静态存储方式
111 0
|
10月前
|
存储 C#
C# “值类型“和“引用类型“在内存的分配
C# “值类型“和“引用类型“在内存的分配
|
10月前
|
C++
C和C++动态内存分配及内存注意事项(重要)
C和C++动态内存分配及内存注意事项(重要)
56 0
|
存储 C++
C++— —变量的四种存储类型
C++— —变量的四种存储类型
|
存储 编译器 C++
【C/C++知识点】变量的4种存储类型
【C/C++知识点】变量的4种存储类型
252 0
|
存储 编译器 C++
临时确保局部变量使用的内存空间
临时确保局部变量使用的内存空间
60 0