关于C语言递归与系统栈的问题。

#include<stdio.h>
void print(int a)
{
printf("%d\n",a++);
print(a);
}
void main()
{
int a=0;
print(a);
}
在打印a的过程中,内存和cpu是怎样工作的?能否详细讲解下?11243的结果能看出这个系统栈容量多大?系统栈的地址在哪?什么时候分配的?这涉及到汇编级别的知识,我想更加了解C程序更底层的硬件工作过程。

C语言调用用函数时,由调用程序向栈中压入函数参数,最后再压入返回地址,后进入被调用函数,当被调用函数执行完成参考压入栈的返回地址回到调用程序。
你写的那个程序就是 一直向栈中压入数据没有返回。这个栈的地址依赖于编译器和操作系统。不同的编译器和操作系统分给程序的地址和长度都可以不同。
这个空间的分配在操作系统加载程序时分配,一般不可改变。
所以上面的11243不能说明容量~~追问

换个问法吧。第一,这个print函数里面执行的printf是一直往栈里面压参数吗?也就是说程序结束的时候是栈满了,不能再往里压了是吗?第二,栈里面存的是单单一个char数据,还是包括printf的汇编指令,还是什么?具体是从哪句代码开始申请的栈空间?

追答

1)程序在运行时有两块可供程序使用的内存空间,一个是堆,一个是栈!而栈的大小位置都有操作系统在加载程序时分配给程序~~。通常C语言所用的malloc之类的函数是从堆中获得内存空间,而栈的使用通常发生在函数间调用,用于传递参数和记录函数间调用层次关系,这个空间不由程序支配。
2)调用printf时,将参数入栈,入栈多少字节取决于参数个数和类型。当printf调用完成再恢复栈,也就是调用printf之前的状态。
3)入栈的内容是数据不是代码~~ 代码是不可以修改 或是像访问数据那样去访问代码~~
4)栈空间由操作系统加载程序时分配。

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答