Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 递归函数中局部变量的地址减少_C - Fatal编程技术网

C 递归函数中局部变量的地址减少

C 递归函数中局部变量的地址减少,c,C,当我学习C编程时,我发现在递归函数中,每次递归调用函数时,存储在堆栈中的局部变量的地址都会减少,并且会从较高的地址变为较低的地址 我想知道原因。为什么有时不增加呢?用于程序“堆栈”的内存通常从内存中的高位地址开始使用,并随着堆栈中放入更多内容而减少地址。对此没有逻辑要求;我们可以很容易地从较低的地址开始,在不断增加的地址中添加新的内容。该公约只是历史的产物 因此,当您调用函数时,它的新数据参数被传递给它,返回地址被保存,函数的局部变量在堆栈上是新的,因此它们进入较低的地址 (事实上,这种安排是危

当我学习C编程时,我发现在递归函数中,每次递归调用函数时,存储在堆栈中的局部变量的地址都会减少,并且会从较高的地址变为较低的地址


我想知道原因。为什么有时不增加呢?

用于程序“堆栈”的内存通常从内存中的高位地址开始使用,并随着堆栈中放入更多内容而减少地址。对此没有逻辑要求;我们可以很容易地从较低的地址开始,在不断增加的地址中添加新的内容。该公约只是历史的产物

因此,当您调用函数时,它的新数据参数被传递给它,返回地址被保存,函数的局部变量在堆栈上是新的,因此它们进入较低的地址

(事实上,这种安排是危险的。如果函数为堆栈上的输入数据创建缓冲区,并且未能防止缓冲区溢出,多余的数据将进入更高的地址,损坏堆栈上的旧内容,包括函数的返回地址。恶意参与者可能通过发送覆盖的输入数据来利用此漏洞使用新地址返回地址。然后,当函数返回时,程序控制转到恶意参与者选择的新地址


如果堆栈向上而不是向下增长,则缓冲区溢出只会损坏当前函数中的其他变量。返回地址不会有风险。)

用于“堆栈”的内存传统上,程序的初始地址是从内存中的高位地址开始,然后随着堆栈上的内容增多而减少地址。这一点没有逻辑要求;我们可以很容易地从低位地址开始,然后将新的内容放在不断增加的地址上。这种约定只是历史的产物

因此,当您调用函数时,它的新数据参数被传递给它,返回地址被保存,函数的局部变量在堆栈上是新的,因此它们进入较低的地址

(事实上,这种安排是危险的。如果函数为堆栈上的输入数据创建缓冲区,并且未能防止缓冲区溢出,多余的数据将进入更高的地址,损坏堆栈上的旧内容,包括函数的返回地址。恶意参与者可能通过发送覆盖的输入数据来利用此漏洞使用新地址返回地址。然后,当函数返回时,程序控制转到恶意参与者选择的新地址


如果堆栈向上而不是向下增长,则缓冲区溢出只会损坏当前函数中的其他变量。返回地址不会有风险。)

谢谢您的帮助谢谢您的帮助