在stm32固件中,我声明了非静态数组:
uint8_t bufCan[8] = {0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 };
当我使用此数组作为参数调用函数时,它就损坏了(填充了其他数据)。在调试时,我注意到此数组位于地址0x20007fc8
。 RAM大小从0x20000000
到0x20008000
。因此,此数组放置在堆栈中并损坏。
如果我将此数组声明为static
,则不会发生。在这种情况下,编译器将其数组放置在地址0x20000234
处。
那么数组损坏的问题是什么?即使我将数组声明为非静态也不应该发生这种情况!
如果我将此数组声明为静态,则不会发生。>
当我使用此数组作为参数调用函数时,它损坏了(填充了其他数据)。>
我认为您的代码看起来像这样
int another_function(int8_t *array){ //Your routine with array } int yourfunction(){ int8_t bufCan[8] = {0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 }; another_function(bufCan); }
因此,当您在another_function中访问数组时,您发现它已损坏。但是,将此数组声明为static可以解决此问题。因此,我们可以假设问题出在堆栈上。
几乎没有发生,首先是动态内存分配,让我假设在调用another_function之前或在annoter_function主体内,您已经使用了动态内存分配器malloc()。这可能导致堆栈损坏。
[另一种选择是您已经向堆栈中的另一个数组写入了一些内容,并越过了它的边界,这又导致了数组损坏。
如果您可以用代码更新您的帖子,我可以提供更详细的答案。