代码之家  ›  专栏  ›  技术社区  ›  Vagish

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

  •  4
  • Vagish  · 技术社区  · 7 年前

    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**/ 
    }
    

    据我所知,C编译器不能保证 Auto 变量将被存储。它可以是堆栈/寄存器(如果可用并且适合处理)。

    value 在通用寄存器上, SetLoadRequest 函数可能引用了错误的数据。

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

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

    只是想确认一下:“如果函数返回局部自动变量的地址,而调用方正在取消引用它”,那么这种行为也是真的吗。

    如果没有,那么C标准中是否有任何东西可以保证这两种情况下的行为?或者正如我之前所说的,它的未定义行为?

    4 回复  |  直到 7 年前
        1
  •  9
  •   Davis Herring    7 年前

    value 在寄存器中,在将指向该内存的指针传递给之前,必须将其存储到内存中 SetLoadRequest

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

        2
  •  3
  •   gsamaras eudoxos    7 年前

    我想得太多了?

    编译器会处理这个问题。如果它将其存储在寄存器中,它将知道如何处理它(带有内存负载)。

        3
  •  1
  •   EOF    7 年前

    C11标准草案n1570:

    6.2.4物品的储存期限

    每次都会创建对象。对象的初始值不确定。如果 每次到达声明时都不确定。

        4
  •  1
  •   Codor    7 年前

    value OpertateLoad . 然而 SetLoadRequest 价值