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.youkuaiyun.com/Sudley/article/details/94357827#_186