暂时不分类,按问题堆积
分类1:
错误1.1:地址操作,指针加减法算错地址
原因,未对指针做处理,可能传参进来的指针是指向结构体等,想用详细的地址操作,最好转成void*或者char*,再进行地址加减法操作。因为忽略指针类型很可能按数据结构大小(或数组大小)去进行加减运算,偏差巨大。如果原参是数组char ch[10],形参是指针char *,其实+1也是地址1;反之亦反,+1是地址10,主要看传进来的形参的形态。
错误1.2:数组越界,无法追踪错误根源
这类错误比较恼人,之前很正常的模块突然出了错误,用gdb调试,bt追溯,心中奔跑的只有草泥马,完全无解有没有。而你的直觉也告诉你不是那个模块出的错。具体是哪引起的问题很难追溯。解决办法似乎也只有靠经验和记忆了,一般来说肯定是新写的模块错误(也可能是近期稍早时候,看运气了),新模块的数组越界了。比如strncpy传入了没有结尾的字符串或者n的值太大,擦写到了不该擦写的地方,所以导致其他模块出错,而具体是谁擦写了那个倒霉的模块,很难知道,因为一大个工程,各种各样的数组和变量堆积在一起,人挤人,变量挤变量,数组挤数组。所以好的习惯很重要,分配一个数组时最好先初始化置零,使用strncpy拷贝进信息时也最好比预留的少一个,这样比较保险,比如要拷贝"hello"进来,一般需要6个字节,其中一个结束符'\0',为了保险,可以给数组7个字节,双结束符。
PS:也许有其他方法追溯这种错误,通过打印各变量的地址(这在一个大的工程里不可想象),或者其他调试工具的命令吧?反正我调试工具玩的不6,现在不会。