在stm32固件中,我声明了非静态数组:
uint8_t bufCan[8] = {0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 };
当我用这个数组作为参数调用函数时,它被损坏(充满了另一个数据)。调试时我发现这个数组放在地址0x20007fc8
。 RAM大小从0x20000000
到0x20008000
。所以这个数组被放在堆栈中并被破坏。
如果我将此数组声明为static
,则不会发生这种情况。在这种情况下,编译器将其数组放在地址0x20000234
处。
那么阵列腐败的问题是什么?即使我将数组声明为非静态,也不会发生这种情况!
答案 0 :(得分:0)
如果我将该数组声明为静态,则不会发生
当我使用此数组作为参数调用函数时,将其损坏(填充其他数据)。
我认为您的代码看起来像这样
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()。这可能会导致堆栈损坏。
另一种选择是,您已经向堆栈上的另一个数组写了一些东西,并越过了它的边界,这又导致了数组损坏。
如果您可以使用代码更新帖子,那么我可以提供更详细的答案。