您好,
我有一个函数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中的变量。
由于每次调用此函数时都会将变量创建到堆栈中,因此变量地址实际上是未知的,但是存在一种模式:
所有变量都堆叠在一起,我想利用这种情况,但我不确定这是否适用于所有情况。
你觉得这有问题,如果有的话,最好的方法是什么
答案 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[]
可以保证内存中的连续性,这样您的函数就可以很好地定义。