这三件事情遇到的时候都困扰了我至少不止一天我才解决,也是这三个错误,遇到的时候老大跟我说“没改过...错误的程序员不是真正的程序员”,而老大这句话是让我每次遇到这些错误坚持在坚持的动力,因为我自诩是个程序员,至少也要成为真正的程序员。
段错误
最怕看到这样的错误提示Program received signal SIGSEGV, Segmentation fault.段错误,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况而引起的。
那么我们实际中最首先想到的有可能是数组越界,用了迷途指针引起的,所以我当时遇到这个错误的时候,第一反应是检查我程序中所有用到数组的地方确定我是否控制对了边界条件,导致了越界,然后第二步检测我所用到的指针,是否是一个未初始化的指针或者是迷途指针,导致访问了不该访问的内存,但是这二者我都没有。
想到数组越界就想到了一个关于字符串拷贝与内存拷贝的问题,这里有一对函数strcpy与strnspy,了解二者是如何拷贝的,尤其是二者的结束,对于二者的参数传递的选择,这样确保不会越界。同时也要考虑memcpy最后一个参数的确定。于是我查看了关于我所有字符串拷贝与内存拷贝的地方,也都确保没有问题。
我采用gdb结合core文件进行定位,错误在一个链表的删除函数中,链表的元素变成了一个非法的指针,指向的内存地址是不可访问,我一步步跟踪调试发现某一个操作后,指针突然变成了无效的地址,而却不是进行链表操作的过程导致的。这让我很郁闷,我不知所措,因为我gdb调试不是很懂&#