在下面的例子中:
#include <stdio.h>
#include <stdlib.h>
void test1 (int x)
{
int * xp = &x;
printf("Address of xp (test1): [%p]\n", &xp);
printf("xp points to: [%p] which is the same as [%p]\n", xp, &x);
}
int main()
{
int x = 4;
printf("Address of x (main): [%p] \n", &x);
test1(x);
return 0;
}
输出:
Address of x (main): [0xbfca0c5c]
Address of xp (test1): [0xbfca0c2c]
xp points to: [0xbfca0c40] which is the same as [0xbfca0c40]
0xbfca0c40
会发生什么(参数地址)
test1)功能之外? 答案 0 :(得分:1)
这是由实现定义的。
它非常可能出现在机器堆栈上,因为堆栈是实现参数传递和局部变量的常用方法。当test1()
函数退出时,将释放堆栈空间,因此可以重用所讨论的内存。
答案 1 :(得分:0)
int x;
形式参数列表中的 test1
是test1
的本地变量。如果您在int y;
中将test1
作为声明,则它具有类似的状态。它具有自动存储持续时间。
退出test1
后,变量不再存在。
通常,编译器通过包含堆栈结构的内存块实现自动存储。当您调用一个函数时,在该函数的自动变量(以及返回地址和需要保存的任何寄存器)的堆栈顶部都会声明新的空间;当你离开这个功能时,堆栈会被弹出#34;回到调用函数之前的位置。
答案 2 :(得分:0)