内存管理
进程空间
程序,是经源码编译后的可执行文件,可执行文件可以多次被执行,比如我们可以
多次打开 office。
而进程,是程序加载到内存后开始执行,至执行结束,这样一段时间概念,多次打
开的 wps,每打开一次都是一个进程,当我们每关闭一个 office,则表示该进程结束。
程序是静态概念,而进程动态/时间概念。
进程空间图示
栈内存(Stack)
栈存储的特点
栈中存放任意类型的变量,但必须是 auto 类型修饰的,即自动类型的局部变量,
随用随开,用完即消。
内存的分配和销毁系统自动完成,不需要人工干预。
栈大小
栈的大小并不大,他的意义并不在于存储大数据,而在于数据交换。
[root@localhost ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size
(blocks, -f) unlimited
pending signals (-i) 16384
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues
(bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
//10M
cpu time (seconds, -t) unlimited
max user processes (-u) 16384
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
堆内存(Heap)
堆存储的特点
堆内存可以存放任意类型的数据,但需要自己申请与释放
堆大小
堆的大小受限于系统的内存大小,一般为物理内存的 1/4 到 1/2。
测试申请大空间
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int * p = (int*)malloc(1024*1024*1024); //1G 完全无压力
if(p == NULL)
{
printf("malloc error\n");
return -1;
}
int *q = (int*)malloc((unsigned int)-1);
//无力归天 42 亿个字节 避免整型溢出
if(q == NULL)
{
printf("malloc error\n");
return -1;
}
return 0;
}
堆内存的申请与释放
malloc()
函数声明
void * malloc(size_t _Size);
函数功能
申请指定大小的堆内存空间,并返回指向该空间的指针。
函数参数
_Size
:要申请的堆内存空间的大小,以字节为单位。- 返回值:
- 成功:返回指向新分配的堆内存空间的指针。
- 失败:返回 NULL。
#