一般有以下几个原因:
- 数组访问越界
- 访问空指针
- 栈溢出
- 修改只读内存
产生segmentfault 实际上就是一个权限问题。
具体的说是错误地使用指针引起的:
- 访问系统数据区,尤其是往系统保护的内存地址写数据,最常见就是给一个指针以 0 (NULL)地址
- 内存越界(数组越界,变量类型不一致等), 访问到不属于本程序的内存区域, 操作系统必须使用虚拟内存才会发生这个错误,因为使用了虚拟内存,各个程序之间的地址是独立的,互相之间不可见的。
还有就是因为栈或堆内存不够,堆内存的最大限制大概为3G,而栈最大只有 1~4M之间,所以一般因为栈内存不够,比如重复递归导致的。
举个形象的比喻:
操作系统就好比一个村的村委会,
每个进程就好比村里的每户人家,每户人家都有自己的土地。
1.虽然村委会领导所有村民,村名也都可以进出村委会,但是毕竟村委会是属于全体村民的,村委会里面的东西,你不能随便拿啊。
- 每个家庭都有自己私有的土地, 你跑到别人家的地里种菜或者偷菜,肯定会和别人家发生冲突啊。
- 每个家庭土地的大小是有限制的,所以种菜的数量也是有限制的。