初探“static”一点儿C语言记忆碎片程序运行的时候内存就那么几块地方放代码放数据还有没初始化的数据所有人都觉得这些东西很重要程序才能跑起来代码放代码段初始化的数据放data段bss段就放那些还没动过的数据它们都在那里等着等着被使用text段比较特殊它一般是只读的有时候也能写data和bss就不一样了它们是随便读写的。C语言看内存分得更细栈堆全局静态区常量区代码区感觉像把一个东西切成好几块栈是自动的函数调用就用它局部变量也放这儿堆得自己动手申请释放不然就麻烦了全局静态区放全局变量静态变量常量区呢放那些不能改的东西字符串常量就在那儿代码区就是代码待的地方CPU眼里的内存跟C语言看到的不太一样代码段数据段堆栈段这些是CPU关心的C语言呢更关注变量怎么用。要理解变量在哪儿得先看看可执行文件怎么和内存挂钩UNIX系统就做得不错可以看看它怎么把文件变成内存地址这样才能明白程序里的东西到底存在哪儿一开始觉得有点难但慢慢就明白了。全局变量整个项目都能用听着挺方便的可要是名字撞了那可就麻烦了静态全局变量就不一样只能在自己的文件里用别人想用都用不了这样就减少了冲突的可能它们都住在全局数据区但是静态全局变量被限制住了作用域小多了你跨文件访问试试肯定不行编译器会告诉你没门儿。局部变量函数调用的时候才出现函数结束就消失了像一阵风静态局部变量就不一样了程序活着它就活着而且只初始化一次下次再用还是上次的值挺有个性的局部变量住在栈里静态局部变量呢跑到了全局数据区真是个特别的存在函数被多次调用看看局部变量和静态局部变量你就明白它们到底有什么不一样了。还有静态函数前面加个static它的作用范围就被限制在这个文件里了别人想用根本找不到很多人都觉得这个东西特别有用可以避免名字冲突保护函数不被乱用还能创建只能自己用的函数静态函数一直待在内存里不用每次都加载感觉效率高了一点所有人都觉得这样挺好的。你在不同的文件里试试调用静态函数看看编译器怎么说它会告诉你这个函数是私有的别想乱用这东西确实有用能让你写代码的时候更安心不会担心别人乱改或者名字冲突真的是这东西很实用。有个问题挺有意思的如果我想自己写一个函数名字跟库函数一样而且还在自己的函数里用原来的库函数怎么办大家都在想这到底是怎么一回事彭老师讲过你可以去找找他的文章看看他是怎么一步一步解决这个问题的很多人看完这个故事都会去想原来C语言还有这么多好玩的东西真的很有意思这东西确实实用。就比如sprintf, 格式化输出到字符串stdlib.h 里的atoi把字符串变成整数math.h 里的sqrt算平方根string.h 里的strcmp比较字符串time.h 里的time获取当前时间这些函数我们经常用有一天你突发奇想想自己写一个strcmp而且想在你的strcmp里调用系统原来的strcmp这听起来有点疯狂但是这确实可以做到。static 还可以用来定义内部链接的变量和函数这是一种非常有用的技术可以帮助你隐藏实现细节防止命名冲突提高代码的可维护性和可重用性比如在一个C文件中你定义了一个static int count 0那么这个count变量只能在这个文件中使用其他文件无法访问它这就避免了与其他文件中同名变量的冲突同时也隐藏了count变量的实现细节其他文件不需要知道count变量的存在只需要调用这个文件提供的接口即可。再比如在一个C文件中你定义了一个static void helper_function()那么这个helper_function函数只能在这个文件中使用其他文件无法调用它这就避免了与其他文件中同名函数的冲突同时也隐藏了helper_function函数的实现细节其他文件不需要知道helper_function函数的存在只需要调用公开的接口即可这种技术在编写大型程序时非常有用可以帮助你将程序分解成多个小的模块每个模块负责一个特定的功能模块之间通过定义明确的接口进行交互模块内部的实现细节则被隐藏起来这样可以降低程序的复杂性提高代码的可维护性和可重用性。所有人都觉得static 是 C 语言里一个很重要的关键字。可是在那种环境下谁能受得了一直想着内存作用域生存期真的很累但没办法想学好 C 语言就得啃这些东西啃明白了才能写出更牛的代码静态全局变量静态局部变量静态函数这些东西都有自己的特点用对了地方就能发挥很大的作用否则就会给自己挖坑真的是这东西很实用要好好学这东西确实有用能让你写代码的时候更安心不会担心别人乱改或者名字冲突真的很有意思这东西确实实用。C 语言就是这样细节很多但是也很强大只要你用心去学就能掌握它写出高质量的程序记住static 只是 C 语言里的一小部分还有很多东西等着你去探索去学习加油吧少年所有人都觉得你以后肯定会成为一个 C 语言高手。