关于C语言变量存储类型和生存期
1、局部变量和全局变量
1、局部变量 在函数的开头定义;在函数的复合语句内定义;在函数的外部定义。
2、全局变量 在函数之外定义的变量是外部变量,外部变量就是全局变量(增加了函数数据联系)
3、当全局变量和局部变量同名,在局部变量的作用范围内,局部变量有效,全局变量被屏蔽
2、变量的存储类型和生存期
1、自动变量(auto):函数中的局部变量,如果不专门用static存储类别,都是动态的分配存储空间,存储在动态存储区中,定义时auto可以不写。(离开函数,值就消失)
2、静态局部变量(static):有的局部变量的值在函数调用结束后不消失儿继续保留原值,占用存储单元不释放,在下次调用变量时,改变量已有值,,存储在静态存储区中(离开函数,值仍保留)
3、寄存器变量(register):提高执行效率,存储在寄存器中(离开函数,值就消失)
4、全局变量:都存放在静态存储区中,作用范围:
1、在一个文件内扩展外部变量的作用域(非静态的外部变量,允许其他文件使用)
2、将外部变量的作用扩展到其他文件(非静态的外部变量,允许其他文件使用)
3、将外部变量的作用限制在本文件中(static) 静态外部变量 (只限本文件使用)
static:局部变量:存储在静态存储区中,变量在整个程序执行期间不释放,其所分配的空间始终存在
全局变量:作用域只限于本文件模块。
一个关于static使用的例子,一开始运行的时候由于没有加static一直报段错误,因为b数组的作用域只在funda的函数中,返回函数首地址时,b其实已经消失了,所以就是一个所谓的野指针,现在并不是数组的首地址,加上static之后,b的作用时间一直到程序结束,所以这个时候可以返回,有数组的指针。可能extern也可以解决这个问题,但是现在我还不会。
#include<stdio.h> int main(){ char *funda(char a[30]); char a[30]; char *c; printf("please input a string:"); gets(a); //funda(a); c= funda(a); puts(c); return 0; } char *funda(char a[30]){ static char b[30]; int i=0,j=0; while(a[i]!='\0'){ if(a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u'){ b[j]=a[i]; j++; } i++; } b[j]='\0'; // puts(b); return b; }
静态存储区更新的慢,会打扫,所以默认的静态变量的值为0,而栈空间更新快,打扫浪费时间,所有栈空间给变量时需要赋值。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· c# 半导体/led行业 晶圆片WaferMap实现 map图实现入门篇
· 易语言 —— 开山篇