在C语言中内存主要分为四个区 即 代码区 、 全局区 、 栈区 、堆区 。下面详细说明一下这四个区作用以及存放的内容。
1.代码区:
代码区在程序执行之前就存在了 , 里面主要存放一些机械码 比如二进制码 ,就是程序的代码 ,当执行程序的时候会将这些二进制的代码转换为刻度的代码 , 主要是由系统进行管理的
2.全局区 :
全局区顾名思义 就是存放和全局有关的内容的 全局变量 常量 静态变量 静态全局变量 字符串常量等等 。这个区的内容会在程序执行结束后由系统自动释放
3.栈区
栈区 主要是存储 局部变量 和函数的形参变量的 。 它的内容 在函数执行完毕以后会被释放 。如果函数的返回值是 局部变量的地址 或者是某个形参变量的地址的时候 就特别需要注意 放回回去的地址 编译器 回做一次保存 但是 如果多次使用这个地址 编译器不会每次都保存的 就会出现 地址丢失的情况 。
4.堆区
开辟堆区的内存 可以使用new关键字来开辟内存空间 , 堆区的内容是由开发者自己开辟创建的 不是有系统创建。并且它的释放也不会随函数的灭亡二消失 , 为什么 数据在栈区会随函数灭亡呢?这里就具体讲一下。
如果是在栈区开辟的空间 变量所保存的数据会存在于栈的地址中 这句话是什么意思呢 :
当数据也保留在了栈区的时候 当函数调用完成之后 这个变量的地址也会随之释放 地址被释放了 就没有地址也就是指针指向了这个数据 相当于这个数据也就释放了d
但是如果是在堆区开辟的内存空间 使用new关键字开辟 同时也是一个局部变量 会在栈下也留下地址 在堆下也留下一样的地址 当栈的地址释放了 但是还有堆的地址指向这个数据 编译器会找到这个堆的地址 获取数据