一、内存溢出定义
指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory,通常出现在某一块内存空间耗尽的时候
二、内存溢出原因
- 内存中加载的数据量过于庞大,例如给 int 整型变量赋予了 long 类型的数据
- 代码中存在死循环
- 内存分配未成功,却继续使用,可以在使用内存之前检查指针是否为 NULL 进行判断
- 内存分配成功,但是未初始化就引用它
- 内存分配成功,初始化后有对变量的引用,使用完后未释放
- 内存分配成功,初始化后,操作变量越过了内存的边界
三、常见的一些内存溢出风险
3.1 strcpy 函数
函数原型:char strcpy(char dest, const char *src);
函数功能:把从 src 地址开始且含有 NULL 结束符的字符串复制到 dest 地址
函数说明:src 和 dest 指向内存区域不可以重叠;dest 必须有足够的空间来容纳 src 的字符串
备注:当 src 的长度大于 dest 分配到的空间,就会出现内存溢出,应当使用 strncpy 避免
3.2 sprintf函数
函数原型:int sprintf(char *buffer, const char *format, [argument]…);
函数功能:格式化字符串,将格式化的数据写入字符串指针 buffer 中
备注:当写入的数据长度比 buffer 的内存空间大,则会导致内存溢出,应当尽量使用snprintf避免
3.3 malloc函数
使用 malloc 函数,需要释放内存空间,还要将原先的指针变量赋予一个 NULL 空指针,如果忘记赋予 NULL 会导致原先的指针变量成为了一个野指针,没有明确指向,系统不知道它会指向什么地方
calloc函数就不需要手动赋予 NULL,是因为在每次调用完calloc函数的时候系统会自动将原先的指针赋予一个空指针