Stm32非静态arraw已损坏

时间:2015-05-29 12:19:49

标签: static stm32

在stm32固件中,我声明了非静态数组:

uint8_t bufCan[8] = {0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 };

当我用这个数组作为参数调用函数时,它被损坏(充满了另一个数据)。调试时我发现这个数组放在地址0x20007fc8。 RAM大小从0x200000000x20008000。所以这个数组被放在堆栈中并被破坏。

如果我将此数组声明为static,则不会发生这种情况。在这种情况下,编译器将其数组放在地址0x20000234处。

那么阵列腐败的问题是什么?即使我将数组声明为非静态,也不会发生这种情况!

1 个答案:

答案 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()。这可能会导致堆栈损坏。

另一种选择是,您已经向堆栈上的另一个数组写了一些东西,并越过了它的边界,这又导致了数组损坏。

如果您可以使用代码更新帖子,那么我可以提供更详细的答案。