7-7 最后的总结

it2023-10-19  66

(1)普通(自动)局部变量分配在栈上,作用域为代码块作用域,生命周期是临时的,链接属性为无连接。定义时如果未显示初始化则其值随机,变量地址由运行时在栈上分配得到,多次执行时地址不一定相同,函数不能返回该类变量的地址(指针)作为返回值。 (2)静态局部变量分配在数据段/bss段(显式初始化为非0则在数据段,显式初始化为0或未显式初始化则在bss段),作用域为代码块作用域(人为规定的),生命周期为永久(天然的),链接属性为无连接(天然的)。定义时如果未显式初始化则其值为0(天然的),变量地址由运行时环境在加载程序时确定,整个程序运行过程中唯一不变;静态局部变量其实就是作用域为代码块作用域(同时连接属性为无连接)的全局变量。静态局部变量可以改为用全局变量实现(程序中尽量避免用全局变量,因为会破坏结构性)。 (3)静态全局变量/静态函数和普通全局变量/普通函数的唯一差别是:static使全局变量/函数的链接属性由外部链接(整个程序所有文件范围)转为内部链接(当前C文件内)。这是为了解决全局变量/函数的重名问题(C语言没有命名空间namespace的概念,因此在程序中文件变多之后全局变量/函数的重名问题非常严重,将不必要被其它文件引用的全局变量/函数声明为static可以很大程度上改善重名问题,但是仍未彻底解决)。 (4)写程序尽量避免使用全局变量,尤其是非static类型的全局变量。能确定不会被其它文件引用的全局变量一定要stati

最新回复(0)