我们目前正在为 msp430 MCU 开发应用程序,并且遇到了一些奇怪的问题。我们发现,在声明“正常”变量之后声明具有范围的数组有时会导致似乎未定义的行为。像这样:
foo(int a, int *b);
int main(void)
{
int x = 2;
int arr[5];
foo(x, arr);
return 0;
}
foo 作为第二个变量传递一个指针,该指针有时不指向arr数组。我们通过单步执行程序来验证这一点,发现主作用域中的 arr array-as-a-pointer 变量的值与 foo 作用域中的 b 指针变量的值不同。不,这不是真正可复制的,我们只是偶尔观察到这种行为。
这甚至在执行 foo 函数的单行之前就可以观察到,传递的指针参数 (b) 根本没有指向 arr 所在的地址。
更改示例似乎可以解决问题,如下所示:
foo(int a, int *b);
int main(void)
{
int arr[5];
int x = 2;
foo(x, arr);
return 0;
}
是否有人对我们为什么会遇到这种行为有任何意见或提示?或者类似的经历?MSP430 编程指南指定代码应符合 ANSI C89 规范。所以我想知道它是否说必须在非数组变量之前声明数组?
对此的任何意见将不胜感激。
更新
@Adam Shiemke 和 tomlogic:
我想知道 C89 对在声明中初始化值的不同方式有什么规定。你是否允许写类似的东西:
int bar(void)
{
int x = 2;
int y;
foo(x);
}
如果是这样,那又如何:
int bar(int z)
{
int x = z;
int y;
foo(x);
}
这是允许的吗?我假设以下内容一定是非法的 C89:
int bar(void)
{
int x = baz();
int y;
foo(x);
}
提前致谢。
更新 2 问题已解决。基本上,我们在调用函数(foo)之前和声明变量之后禁用中断。我们可以在一个简单的示例中重现该问题,解决方案似乎是在禁用中断调用之后添加一个 _NOP() 语句。
如果有人有兴趣,我可以发布重现问题的完整示例,以及修复?
感谢您对此的所有意见。