在C语言程序中,栈空间是由编译器管理的,在程序中可以体现栈空间使用的例子是参数的传递、返回值的使用以及自动变量的空间。
在运行程序的系统中,栈空间是从高地址向低地址增长的。在程序的执行结果中打印参数的地址就可以看到参数地址的关系。
参数入栈的顺序是:后面的参数在高地址处,前面的参数在低地址处。事实上,进入函数后,第一个参数将位于栈空间的最后。因此,程序在按照顺序访问参数的时候,还是从低地址到高地址的访问。注意:具体参数将占用多大的栈区域空间,将由编译器决定,因为入栈之前的栈指针和入栈之后的栈指针之间的内容不一定和参数大小的和一致。
在函数退出之后,栈指针将返回到函数进入之前的位置。从上面我们得出,在函数调用的过程中,每增加一个层次,都会让程序需要更大的栈空间。
事实上,在函数的调用过程中,参数和返回值都将使用栈空间。栈空间的具体规模是和编译器有关系的,可以确定的一点是:一般参数入栈后,前面的参数将位于内存的低地址,后面的参数将位于内存的高地址。
在程序中,函数内部使用的自动变量也是保存在栈区域的。编译器在处理自动变量的时候,将在参数栈区的后面为自动变量分配栈区域。栈的开辟顺序和参数的顺序是一致的。
编译器只会为函数内部的自动变量在栈上开辟空间,如果函数内部的变量改为静态变量,这个时候编译器就不会为这个变量在栈上开辟空间了,而是将它放入静态的存储区内。
程序中使用的自动局部变量和参数的类型都是C语言的基本类型,在32位的系统中,int为32位(4字节),这种变量类型将占用4个字节的栈空间。在程序中,可能使用较大的栈空间的变量类型是结构体和数组。
关于栈空间的使用,完全是由编译器来处理的,在程序中不需要管理栈。当函数退出之后,函数栈上的内容将被释放,因此,在函数跳出后,函数栈上的内容是不能被别的函数使用的。
内层函数可以使用外层函数的栈内存,但是外层函数不能使用内层函数的栈内存。
自动变量的地址不可以作为函数返回值,但是可以作为参数传递给其他函数。
审核编辑 :李倩
全部0条评论
快来发表一下你的评论吧 !