内存溢出: 程序在运行过程中尝试访问超过其分配内存空间范围的内存区域。内存溢出通常会导致程序崩溃或者出现不可预料的行为。
1 栈溢出
当函数调用过程中,递归层级过深或者局部变量占用的栈空间过大,超出了栈的内容范围,就会发生栈溢出。
示例程序
#include<stdio.h>
void overflow(){
overflow();
}
int main(){
overflow();
return 0;
}
2 缓冲区溢出
当向一个固定大小的缓冲区写入超过其容量的数据时,会导致数据溢出到相邻的内存区域,这就是缓冲区溢出。
示例程序
#include<stdio.h>
#include<string.h>
#define N (65536*1024)
int main(){
char s[N];
int i;
memset(s, 'a', N);
for(i=0; i<N; i++){
putchar(s[i]);
}
puts("");
return 0;
}
3 数据溢出
当使用 malloc 分配内存时,如果分配的内存大小不足以存储实际写入的数据,也会发生数据溢出。
示例程序
#include<stdio.h>
#include<string.h>
int main(){
char s1[5], s2[] = "Helloworld";
strcpy(s1, s2);;
puts(s1);
puts(s2);
return 0;
}