编译原理不是很清楚,基于以下两个假设:
1、调用子函数时,主函数中的变量和参数压栈存储到栈上;
2、C/C++中都能通过传址的方式修改主函数中变量的值;
问题:
子函数被调用时,主函数中所有相关的变量不是已经保存到栈上了吗,那子函数是如何修改主函数中经传址的变量的内容的呢? (本人表达水平有限,有点费解。)
例子:
int main(void)
{
int a = 0;
int b = 0;
scanf("%d, %d", &a, &b);
return 0;
}
基于这样的应用,提出的两个假设不是自相矛盾吗
/*******************************************************************************************************************/
感谢wangganggang90的回答,可能是我没把问题描述清楚。
是这样的,从我的认知,栈是先进后出的,保存在栈中的主函数变量不能被子函数随机的访问;要访问就只能将被压栈的数据弹出栈到堆内存中。
所以提出了以上的问题。
不过,也有这种可能:在给子函数传址时,用栈的段地址加上变量在栈上的偏移地址计算出变量在栈上的地址A后,再把地址A传给了子函数。这样,子函数就能修改主函数中经传址的变量的值了。
提出此问题是基于程序没有方法或不能访问或寻址保存在栈上的数据,也就是栈上的数据只能出栈后才能被程序访问到。刚才在网上读了一些贴子,才知道程序是能够寻址栈上数据的。
不知道,主函数运行时,他会把它的全部变量出栈吗,那出栈后是保存在寄存器里面吗,那如果主函数中定义了非常多的局部变量,会有那么多寄存器吗,那又会怎样处理呢
还有很多问题不懂,觉得是时候学习一下编译原理了