我已经定义了一个带有初始值的变量。
当逐步执行代码时:
当逐步执行代码时:
- 我可以看到初始值
- 我的函数改变了该值
- 当我稍后使用该变量时,它具有错误的值
变量无法保持值的原因有很多。虽然有些原因非常复杂且难以调试,但最常见的一些原因包括:
变量被中断修改了
//---in main()---
unint8_t rxByte = 0;
printf("%d", rxByte); //prints "0"
//---later in Uart0_Rx_Handler()---
rxByte = U0RXREG; //rxByte set to (for example) 55
//---later in main()---
printf("%d", rxByte); //still prints "0"!!!
如果一个变量被中断处理程序修改,它需要被声明为volatile。Volatile可以让编译器知道该变量可能会异步修改,并且不应使用寄存器中的缓存副本。//---in main()---
volatile unint8_t rxByte = 0;
printf("%d", rxByte); //prints "0"
//---later in Uart0_Rx_Handler()---
rxByte = U0RXREG; //rxByte set to 55
//---later in main()---
printf("%d", rxByte); //corectly prints 55
越界访问数组
C语言中没有检查机制可以防止您超出数组的边界。
int array[10];
int my_var = 55;
printf("%d", my_var); //prints "55"
for(i=0; i<11; i++) // eleven is one too many indexes for this array
{
array[i] = i;
}
printf("%d", my_var); // prints "11"!!!
在这种情况下,我们循环了11次,这比数组的索引大1。在大多数编译器中,这将导致覆盖数组后声明的变量(无论它们在页面上的任何位置,甚至不必在下一行声明)。这种情况可能发生在许多不同的情况下,包括多维数组和堆栈损坏。int* pCount;
pCount = 10; //forgot the asterisk!!!
printf("%d", *pCount); //prints ??
使用相同名称的变量进行屏蔽
在内部作用域(例如if/for/while块或函数内部)中重复使用变量名称会隐藏其他地方具有相同名称的变量。
int count = 10; //count is 10
if(byteRecevied)
{
int count = U0RXREG; //count redeclared!!!
DoSomething(count);
printf("%d", count); //prints "55"
}
printf("%d", count); //prints "10"
force_a = mass_a * acceleration_a
force_b = mass_b * acceleration_b
total_force = force_a + force_b
total_force = (mass_a * acceleration_a) + (mass_b * acceleration_b)