Linux下报错:Segmentation fault.
遇到的问题:程序在读文件之后,准备执行fclose(fp);时,出现了如下错误:
Program received signal SIGSEGV, Segmentation fault.
解决方法:倒腾了好久,结果发现是一个小小的 & 在作祟。
原来把read( f, buff, nFileSize )
写成了read( f, &buff, nFileSize ),多了一个 & !
经验总结:
1.关于段错误(Segmentation fault):
所谓的段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个 48位的寄存器,其中的32位是保存由它指向 的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就 保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了越界访问,cpu 就会产生相应的异常保护,于是segmentation fault就出现了。
2.原因
在编程中以下几类做法容易导致段错误,基本是错误地使用指针引起的:
1)访问系统数据区,尤其是往系统保护的内存地址写数据,最常见就是给一个指针以0地址
2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域
3)其他
因此,需注意:
①定义了指针后记得初始化,在使用的时候记得判断是否为NULL
②在使用数组的时候是否被初始化,数组下标是否越界,数组元素是否存在等
③在变量处理的时候变量的格式控制是否合理等
具体的解决方法可参考如下: