gpt4 book ai didi

c - c中 "normal"变量之前的数组声明?

转载 作者:行者123 更新时间:2023-12-02 05:35:31 28 4
gpt4 key购买 nike

我们目前正在为 msp430 MCU 开发应用程序,遇到了一些奇怪的问题。我们发现,在声明“正常”变量之后声明具有作用域的数组,有时会导致看似未定义的行为。像这样:

foo(int a, int *b);

int main(void)
{
int x = 2;
int arr[5];

foo(x, arr);

return 0;
}

foo 被传递一个指针作为第二个变量,有时 不指向arr 数组。我们通过单步执行程序来验证这一点,并看到 main 作用域中的 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() 语句。

如果有人感兴趣,我可以发布重现该问题的完整示例以及修复方法吗?

感谢您对此的所有投入。

最佳答案

这看起来像是一个编译器错误。

如果您使用您的第一个示例(有问题的示例)并将您的函数调用编写为 foo(x, &arr[0]);,您会看到相同的结果吗?如果像 int arr[5] = {0}; 这样初始化数组会怎么样?这些都不应该改变任何东西,但如果他们这样做会暗示编译器错误。

关于c - c中 "normal"变量之前的数组声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2515031/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com