Static Stm32非静态阵列已损坏

Static Stm32非静态阵列已损坏,static,stm32,Static,Stm32,在stm32固件中,我声明非静态阵列: uint8_t bufCan[8] = {0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 }; 当我用这个数组作为参数调用函数时,它会被破坏(填充了另一个数据)。调试时,我观察到该数组位于地址0x20007fc8。RAM大小从0x20000000到0x20008000。因此,此数组被放置在堆栈中并被损坏 如果我将此数组声明为静态,则不会发生这种情况。在本例中,编译器将其数组放置在地址0x20000234处 那个么什么是数

在stm32固件中,我声明非静态阵列:

uint8_t bufCan[8] = {0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 };
当我用这个数组作为参数调用函数时,它会被破坏(填充了另一个数据)。调试时,我观察到该数组位于地址
0x20007fc8
。RAM大小从
0x20000000
0x20008000
。因此,此数组被放置在堆栈中并被损坏

如果我将此数组声明为
静态
,则不会发生这种情况。在本例中,编译器将其数组放置在地址
0x20000234

那个么什么是数组损坏的问题呢?即使我将数组声明为非静态数组,也不应该发生这种情况

如果我将此数组声明为静态数组,则不会发生his

当我用这个数组作为参数调用函数时,它会被破坏(填充了另一个数据)

我想你的代码是这样的

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);
}
所以,当您访问另一个_函数中的数组时,您会发现它已损坏。但将此数组声明为静态可以解决问题。因此,我们可以假设问题与堆栈有关

可能发生的事情很少,首先是动态内存分配,让我假设在调用另一个函数之前,或者在另一个函数体中,您已经使用了动态内存分配程序malloc()。这可能导致堆栈损坏

另一种选择是,您已经向堆栈上的另一个数组写入了某些内容,并越过了它的边界,从而再次导致数组损坏


如果你能用代码更新你的帖子,我可以提供更详细的答案。

你设置了合适的堆栈大小吗?您能显示链接器脚本和启动代码吗?一小段代码来演示这个问题也很好。我认为了解您使用的编译器也很重要。如果您声明它是静态的,它将不再在堆栈上分配。这可能指向您在数组超出范围后使用它。或者,另一段代码正在破坏该内存位置的堆栈。