关于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,而栈空间更新快,打扫浪费时间,所有栈空间给变量时需要赋值。

 

 

    

posted @   风中凌乱的猪头  阅读(147)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· c# 半导体/led行业 晶圆片WaferMap实现 map图实现入门篇
· 易语言 —— 开山篇
点击右上角即可分享
微信分享提示