使用Valgrind检查新写好的代码,在调用函数a时,valgrind报告了一系列的Invalid write和Invalid read,警告所在行数就是函数a的定义位置,让人摸不着头脑。而且也不是每次调用a都会告警。
不经意间发现在Invalid write之前还有一个SP change的警告,在这个警告的提醒下发现函数a中一个局部变量数组特别大,达到了6MB,加上其它数据超过了栈空间(linux默认为10M),在某些情况下会导致栈溢出,并导致一系列莫名其妙的问题,很难定位原因。
记录一下,引以为戒,局部变量如果出现一个大数组,一定考虑它的大小,可以考虑替换为静态变量,或者用malloc。