-->

内存分区

内存分区

  • 生命周期:分为局部变量和静态变量
  • 局部变量:在函数内部声明的变量,这个变量也只是在函数内部有效,只有当函数结束的时候,内存才会被释放,无论是嵌套在内层的复合语句中,都是等到函数结束的时候内存才能被释放。
  • 全局变量:在函数外部声明,只有当文件或者程序结束时才会被释放内存。

在函数的篇章讲了,值传递和地址传递以及数组传递,但是当我们想要返回处理好的地址时,发现这个内存在这个函数结束时已经被释放,返回的地址想要获取他的值,就会访问没有定义的空间从而导致报段错误。

那我们就可以把局部变量的声明周期延长,使得在外面也可以使用,可以使用关键字static来修饰变量的值,使得把局部变量变成静态局部变量,可以延长生命周期使得要到整个系统结束才会释放这个内存。

在32bit的Linux系统中,每个程序运行都会得到4GB大小的内存空间,只不过这个内存是虚拟内存,物理内存才是真实的4GB大小,虚拟内存是由物理内存映射而来的

下面是内存的分区

image

  • 保留区:这个区有128M的大小,一般而言用户是不能访问这保留区里面的数据的,即没有权限访问,用户一旦访问里面的数据就会报段错误。对于C语言中的NULL指的就是第一个地址0x0000_0000

  • 代码段:程序是由数据和指令组成的,代码段存储的是程序编译后生成的的指令,一共分为两段.text段.init段

  • .text段:存储用户程序生成的指令。(只读)

  • .init段:存储系统初始化的指令。(只读)
    对于指令和数据的存储有两种结构

  • 冯诺依曼结构:把数据和指令存储在一起。

  • 哈佛结构:把数据和指令分开存储。(更快)

  • 数据段:存放程序的数据,可以分为3个段.rodata和.data和.bss这三个段。

  • .rodata段:存放程序中的常量,只有当程序结束时内存才会被释放。(只读)

  • .data段:存放程序中已经初始化的全局变量和已经初始化的静态局部变量,以及初始化不为0的全局变量和初始化不为0的静态局部变量。

  • .bss段:存放未被初始化的全局变量和未被初始化的静态局部变量,以及初始化为0的全局变量和初始化为0的静态局部变量。

  • 堆空间:在这个空间用户可以自由分配,但是需要提前向系统申请这个空间,一般需要使用这两个函数申请空间malloc()和calloc(),如果用户使用完成之后需要释放申请的内存空间,使用free()函数,如果不释放那么会造成内存泄漏,释放完成后需要把接收的指针也赋值为空。

  • malloc()函数

//函数原型

void *malloc(size_t size);


//包含头文件
#include <stdlib.h>

函数的作用

传入一个以字节为单位的常量,向堆空间申请内存,最后返回申请内存的首地址,注意申请的内存需要强制转换为需要的指针类型

函数参数

参数 说明
size_t size 以字节为单位,向堆空间申请内存
返回值 返回申请空间的首地址
  • calloc()函数
//函数原型

void *calloc(size_t nmemb, size_t size);


//包含头文件
#include <stdlib.h>

函数的作用

传入一个以字节为单位的常量,再传入一个申请的数量(也就是需要多少个以size这么多个字节为单位的数据),向堆空间申请内存,最后返回申请内存的首地址,注意申请的内存需要强制转换为需要的指针类型

函数参数

参数 说明
size_t nmemb 申请的数量
size_t size 申请内存的数量以多少个字节为单位
返回值 返回申请空间的首地址
  • free()函数
//函数原型

void free(void *ptr);

//包含头文件
#include <stdlib.h>

函数的作用

传入一个需要释放内存的首地址,然后就会释放这个地址申请的内存

函数参数

参数 说明
void *ptr 需要释放内存的首地址
返回值

还有一个函数realloc()可以改变申请到的内存的大小,一般很少使用。

  • 栈空间:存储程序的命令行参数(main函数的参数)、局部变量、函数的参数、返回值、地址,在函数被调用的时候系统会在栈上分配内存给函数,当函数调用完成是内存会被自动释放。这个空间不是很确定会向下递增,数据都是先进后出的。默认是8M,可以修改
#使用这个指令可以看栈下的空间
ulimit -a
#使用这个指令可以修改栈下的空间
ulimit -s 数值

需要注意的是给栈分配空间只有在当前的终端有效,当这个终端关闭重新打开时,栈的空间会从新分配到8M

posted @ 2024-06-14 10:02  wuju  阅读(50)  评论(0)    收藏  举报