#c语言知识
内存管理
1.作用域
(1)代码块作用域(代码块是{}之间的一段代码)
(2)函数作用域
(3)文件作用域
2.局部变量(自动变量auto):
在函数(代码块{})内部定义的变量
(1)作用域:在函数内部
(2)生命周期:从变量定义到函数结束
*局部变量在栈区
*未赋初值,内容随机
*形参是局部变量的一种
3.全局变量
在函数外部定义的变量
(1)作用域:整个项目中所有文件
(如果在其他文件中使用 需要声明)
(2)生命周期:从程序创建到程序销毁(和程序同生共死)
*全局变量存在数据区
*全局变量可以和局部变量重名 不同文件的全局变量不可重名
*数据在操作时会采用就近原则
重新开辟一片内存空间 地址不同 / 123和456地址相同
4. 静态(static)局部变量
(1)作用域:在定义的函数内部
(2)生命周期:从程序创建到程序销毁(和程序同生共死)
*在数据区进行存储,不会因为栈区的变化而发生改变。
*static局部变量的值只初始化一次,可赋值多次。
*若未赋初值,则由系统自动赋值:数值型变量自动赋初值0,字符型变量赋空字符。
(局部变量未初始化 值为乱码)
5.extern全局变量声明:extern int a;声明一个变量,这个全局变量在别的文件中已经定义了,这里只是声明,而不是定义。
6.全局函数和静态函数
在c语言中函数默认都是全局的,使用关键字static可以将函数声明为静态,函数定义为static就意味着这个函数只能在定义这个函数的文件中使用,在其他文件中不能被调用,即使在其他文件中声明这个函数都没用。
对于不同文件中的static函数名字可以相同。
(声明了之后才能转过去)
7.全局函数
(1)作用域:在整个项目中所有文件中使用
(2)全局函数的名称在作用域中是唯一的。
*在c语言中,不支持函数重载(同一个函数名对应不同参数名)。
*一个函数可以调用自己(递归函数,一定要有出口)
8.静态函数 (可以和全局函数重名)
作用域:当前文件中
生命周期:从程序创建到程序销毁(和程序同生共死)
注意:
*允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰。
*同一源文件中,允许全局变量和局部变量同名,在局部变量的作用域内,全局变量不起作用。
*所有的函数默认都是全局的,意味着所有的函数都不能重名,但如果是static函数,那么作用域是文件级的,所以不同的文件static函数名是可以相同的。
const int abc=123;安全的常量 存储区为数据区常量区
内存四区:
全局初始化数据区/静态数据区(data段)
该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。
未初始化数据区(bss区)
存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化为0或者空(NULL)。
程序在加载到内存前,代码区和全局区(data和bss)的大小就是固定的,程序运行期间不能改变。然后,运行可执行程序,系统把程序加载到内存,除了根据可执行程序的信息分出代码区(text)、数据区(data)和未初始化数据区(bss)之外,还额外增加了栈区、堆区。
1.代码区
*代码区存放CPU执行的机器指令既程序汇编而成的二进制代码。
*代码区是共享的,对于频繁执行的程序,内存中只需要保存一份。
*代码区是只读的,只读的原因是防止程序意外修改了指令。
*代码区还规划了局部变量的相关信息。
2.数据区
(1)bss段:
*未初始化的静态变量(全局、局部)
*初始化为0的静态变量(全局、局部)
*未初始化的全局变量和初始化为0 的全局变量
*未初始化的全局常量
data段:
*初始化非0的静态变量(全局、局部)
*初始化非0的全局变量
rodata段:
*初始化为0 的全局常量
*初始化非0的全局常量
3.栈区(stack)
栈是一种先进后出的内存结构,由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行过程中实时加载和释放,因此,局部变量的生存周期为申请到释放该段栈空间。
4.堆区(heap)
堆是一个大容器,它的容量要远远大于栈,但没有栈那样先进后出的顺序。用于动态内存分配。堆在内存中位于bss区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。
(a、b间有间隔 防止被其他程序篡改数据 由高到低)