C:通过引用传递自动变量

Vag*_*ish 4 c cpu-registers

我遇到了一段目前工作正常的代码,但在我看来,它的未定义行为可能会在将来引入一个bug.

伪代码:

void OpertateLoad(int load_id)
{
   int value = 0;

   /* code to calculate value */

   SetLoadRequest(load_id,&value);

   /*some processing  not involving value**/

}

void SetLoadRequest(int load_id, int* value)
{
   /**some processing**/
   LoadsArray[load_id] = *value; 
   /**some processing**/ 
}
Run Code Online (Sandbox Code Playgroud)

在我的理解中,C编译器不保证Auto将存储变量的位置.它可以是堆栈/寄存器(如果可用并且适合处理).

我怀疑如果编译器决定存储value到通用寄存器,那么SetLoadRequest函数可能会引用错误的数据.

我做对了吗?还是我在思考它?

我正在使用IARARM编译器ARM CORTEX M-4处理器.

- - - - - :编辑: - - - - -

答案总结一下"无论变量存储在何处,编译器都将确保数据在调用之间保持不变".

只是想确认:如果函数返回本地自动变量的地址并且调用者正在取消引用它,这种行为也是正确的吗?

如果否,则C标准中是否有任何保证两种情况下的行为?或者正如我之前所说的未定义的行为?

Dav*_*ing 9

你是在思考它.编译器知道,如果value在寄存器中,则必须在将指针传递给该存储器之前将其存储到存储器中SetLoadRequest.

更一般地说,根本不考虑堆栈和寄存器.语言说有一个变量(不说它是如何实现的),并且你可以获取它的地址并在另一个函数中使用它来引用变量.所以你可以!

该语言还说当离开块时局部变量不再存在,因此该权限不会扩展到返回指向局部变量的指针(如果调用者对指针执行任何操作,则会导致未定义的行为).