初学C语言那会,最搞不懂的就是c语言static什么意思,照着网课代码敲了无数次,输出结果永远和教程不一样。
当时写的是普通局部变量的测试代码,循环调用函数打印数值,变量每次都会清零重置,折腾好久才搞明白,是少加了static修饰符。
static修饰局部变量
最开始踩的最大的坑,就是分不清普通局部变量和static局部变量的区别。普通的局部变量,只会在函数调用时临时开辟内存,函数执行结束后,内存直接释放,数值彻底清零,下次调用函数会重新初始化变量。
加上static之后完全不一样,被static修饰的局部变量,初始化只会执行一次,函数结束后变量的内存不会释放,会一直保留当前的数值,下次再次调用函数时,会直接沿用上次结束时的值,不会重新赋值。
我当时写了个简单的计数函数,不加static的时候,循环十次输出的数字永远都是1,每一次调用函数变量都重置了。
加了static,数字就会从1依次累加到10,这也是static最实用的核心作用,能让局部变量具备记忆性。
变量生命周期变长了。
static修饰全局变量与函数
后来和同寝室学编程的朋友一起调项目代码,才发现static不止能修饰变量,还能修饰全局变量和自定义函数,这是我之前完全没接触过的用法。
朋友当时在做多文件编程,全局变量不加static时,多个源文件会出现变量重复定义的报错,调试了半个多小时都没找到问题根源。
给全局变量加上static之后,这个变量就被限制在了当前源文件内部,无法被其他文件引用、调用或者修改,直接解决了跨文件冲突的问题。
同理,被static修饰的函数,也只会在当前文件内有效,不能被外部文件调用,相当于给代码做了私有化封装,避免全局命名冲突。
| 修饰对象 | 核心作用 | 适用场景 |
|---|---|---|
| 局部变量 | 保留变量历史数值,仅初始化一次 | 函数计数、状态记录 |
| 全局变量 | 限制作用域为当前源文件 | 多文件编程防冲突 |
| 自定义函数 | 限制函数仅当前文件可调用 | 封装内部工具函数 |
之前一直误以为static是单纯的“静态固定”意思,其实根本不是固定数值,只是固定了内存和作用域,变量依旧可以正常修改、赋值,只是不会自动重置而已。
写完测试代码关掉编译器的时候,电脑桌面还摊着写满变量区别的草稿纸,笔尖还停在static的释义批注上。