全局变量 VS 本地变量

C全局变量与本地变量

全局变量
程序内所有函数可以直接调用的变量,对所有函数都是可见的,程序执行完成后释放变量所占内存。
局部变量
相对于全局变量,作用域仅在某个函数中,当函数执行完成释放内存。
**全局变量定义:**在函数外定义变量,若没有初始化则默认0值。
**本地(局部)变量定义:**在函数内定义,若没有初始化不知道会是啥。
静态本地变量
在本地变量定义时加上static修饰符就成为静态本地变量

  • 当函数离开时,静态本地变量会继续存在并保持其值
  • 静态本地变量的初始化只会在第一次调用这个函数时做,以后进入函数会保持上次离开时的值
  • 全局生存期,局部作用域,静态变量相当是全局和局部变量的混合版本
#include <stdio.h>

int f(void);
int gALL = 7;  //全局变量

int main(int argc,char const *argv[])
{
        int i = 6;  //局部变量
        printf("全局&本地变量测试:\n");
        printf("in %s gALL=%d\n",__func__,gALL);  //__func__以字符串类型打印本函数名称
        f();
        printf("again in %s gALL=%d\n",__func__,gALL);
        printf("静态本地变量测试:\n");
        fs();
        fs();
        fs();
        return 0;
}

int f(void){
        printf("in %s gALL=%d\n",__func__,gALL);
        gALL += 3;
        printf("in %s gALL=%d\n",__func__,gALL);
        //printf("in %s i=%d\n",__func__,i); //i是局部变量,只在main中可以使用
        return gALL;
}

int fs(void){
        static int all= 100;
        all +=10;
        printf("in %s all=%d\n",__func__,all);
}

在这里插入图片描述

注意事项

返回本地变量的地址是危险的:本地变量的地址在函数运行结束后释放,所以地址可以被重新分配和修改;
返回全局变量或静态本地变量的地址是安全的;
返回在函数内malloc的内存是安全的,但是容易造成问题;
最好的做法是返回传入的指针;
尽量避免使用全局变量,使用全局变量或者静态本地变量的函数是线程不安全的。

Linux Shell全局变量与本地变量

全局变量
export关键字进行定义,export可以省略,但是一般为了读取方便建议还是规范定义格式。
本地变量
local关键字进行定义,不局限于定义的位置。
**全局变量作用域:**脚本内在定义位置后的所有函数。
**局部变量作用域:**函数及函数内引用的其他函数,作用域比C语言的广。如下的f3中
为了方便区分,Shell中一般约定全局变量使用大写英文进行定义,本地变量使用英文小写定义。

#!/bin/bash

f1(){
        export NUM=10
        echo "f1 NUM=$NUM"
        echo "f1 string=$string"
}

f2(){
        local string="aa"
        echo "f2 NUM=$NUM"
        echo "f2 string=$string"
        f3
}

f3(){
        local NUM=9    #不加local的话执行f4输出的结构变成9
        echo "f3 string=$string"
        echo "f3 NUM=$NUM"

}

f4(){
        echo "f4 string=$string"
        echo "f4 NUM=$NUM"
}

f1
f2
f4

在这里插入图片描述
注意:
Shell脚本是按照程序的编写循序一条一条执行的,比如执行f1之前并没有定义string,所以即使f2里面定义string的关键字换成export,在f1中string也是空的。

变量释放

Linux Shell
unset 变量名
比如unset NUM会释放NUM变量。
C语言
C语言中如何想释放变量可以使用malloc动态配置分配变量,使用完成后free。
动态内存分配参考链接:
https://blog.csdn.net/Sudley/article/details/94357827#_186

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值