« 上一篇下一篇 »

问题记录——堆栈问题、strcmp()比较问题

1、堆栈太小导致图片数据接收异常

如上图示,查看编译输出的信息可知,程序执行过程中使用的堆栈大小为:1592 bytes + Unknown,也就是说,按这个数值来看,最少的堆栈大小起码也要给定2KB的空间才够用,一般来说,我们是根据这个已知的字节数,给出它的两倍大小做为堆栈空间,即1592*2=3184 bytes,而实际在程序中查看,堆栈只分配了 0x400的大小,即1024字节,很明显,这个大小是不够用的,所以导致在图片数据传输过程中,即涉及到比较大的堆栈空间操作时,数据发生了紊乱,从而使得MCU接收到的数据就不正确了。

解决办法:增加分配给堆栈的内存大小。当我给定堆栈0x800的空间,即2KB后,经过测试,图片数据传输未再出现之前的错误。

总结:为了避免因为堆栈空间大小而出现一些不确定的错误,最好是在完成整个软件的功能后,查看编译的提示信息,然后根据这个信息,再回过头来调整堆栈的大小,这样就不会出现因为堆栈大小而引起程序执行异常了。相比出了问题后再去花大量时间找原因,在编写代码时就对可能的问题进行预防和避免,显示是更加有效率的工作方式。


2、strcmp()比较两个字符数组的问题

讲这个问题之前,我们首先要明白strcmp()函数最重要的一个性质,即:如果是两个内容完全相同的数组,则比较过程直到遇到'\0'才会停止

我所遇到的问题是数组里面有两个数组进行比较,大小都是20字节,如果比较结果不相同,则将一个数组的内容拷贝给另一个数组,但是结果却是第一次比较发现不同后,且完成了拷贝过程后,下一次比较还是会得出两个数组不相同的结果,原因是什么呢,经过调试发现,原来是数组的大小不够,导致里面的元素全部都被有效数据占据,从而缺少strcmp()比较的结束判定符'\0',所以导致不能够正常结束比较,至于为什么会判定不相等呢?我没具体探究,理论上看有两种可能,一是整个数组的数组的元素都已经比较完了,却没有检测到结束符,所以函数直接判定不相等,还有一种就是比较到了数组的最后一个字节后,继续使用两个数组后面地址的内容进行比较,而两个数组末尾之后地址空间存储的内容是不定的,可能恰好两个空间的数值不相等,所以函数判定为不相等。

解决办法:增大数组大小,使其在有效数据后包含有结束符'\0'。

总结:反正注意一点,就是使用strcmp()来进行数组比较时,必须给数组分配足够大的空间,使其在有效数据后包含有结束符'\0',这样就不会出现明明两个相等的数组却一直判定为不相等的情况了。当然,这种比较最好还是用字符串的形式来进行,因为字符串末尾是会自动添加结束符的,这样就不用担心没有结束符而使得比较结果出错了。


—— 2019.08.21  23:57  于广州花都