函数变量的间接寻址

时间:2014-04-09 11:19:48

标签: c

  • IDE:MPLAB IDE 8.87
  • 语言:C
  • 编译器:C30 / ASM30
  • 调试器/编程器:MPLAB ICD 3
  • uController:Pic24F

您好,

我有一个函数Temp_Picture。函数Temp_Picture具有如下变量声明:

void Temp_Picture(void) 
{   
    unsigned char Year_T  = count_tens(Year);
    unsigned char Year_U  = count_ones(Year,Year_T);            
    unsigned char Day_T   = count_tens(Day);
    unsigned char Day_U   = count_ones(Day,Day_T);
    unsigned char Hours_T = count_tens(Hours);
    unsigned char Hours_U = count_ones(Hours,Hours_T);
    unsigned char Month_T = count_tens(Month);
    unsigned char Month_U = count_ones(Month,Month_T);
    unsigned char Minute_T= count_tens(Minute);
    unsigned char Minute_U= count_ones(Minute,Minute_T);
    function_b(Non void);

}

我希望function_b间接访问Temp_Picture中的变量。

由于每次调用此函数时都会将变量创建到堆栈中,因此变量地址实际上是未知的,但是存在一种模式:

xxx

所有变量都堆叠在一起,我想利用这种情况,但我不确定这是否适用于所有情况。

你觉得这有问题,如果有的话,最好的方法是什么

2 个答案:

答案 0 :(得分:3)

可能是一种模式。但是,你不应该依赖于此。

C标准没有规定堆栈的排列方式。对堆栈做出假设的代码非常脆弱。更改编译器或添加可能影响堆栈的标志(例如-O3)将破坏内容。

将所有相关字段打包到结构中是可行的方法:

struct {
    unsigned char Year_T;
    unsigned char Year_U;
    unsigned char Day_T;
    unsigned char Day_U;
    unsigned char Hours_T;
    unsigned char Hours_U;
    unsigned char Month_T;
    unsigned char Month_U;
    unsigned char Minute_T;
    unsigned char Minute_U;
} some_struct;

然后你只需要传递对结构的引用:

function_b(&your_struct);

重要的是要注意your_struct只会在Temp_Picture返回之前存在。

答案 1 :(得分:2)

这不起作用,因为您无法保证将变量添加到连续内存中的堆栈中。 (您只能保证数组类型的元素)。

事实上,假设这是未定义的行为

使用数组unsigned char[]可以保证内存中的连续性,这样您的函数就可以很好地定义。