我有一个问题。我有以下代码
#include <stdio.h>
int *ptr;
int myfunc(void);
main()
{
int tst = 3;
ptr = &tst;
printf("tst = %d\n", tst);
myfunc();
printf("tst = %d\n", tst);
}
int myfunc(void)
{
*ptr = 4;
}
局部变量存储在堆栈中,我创建了一个全局指针*ptr
,并使其指向main
中的局部变量,现在,当我调用myfunc
时,main
的局部变量被压入堆栈,在myfunc
中,我更改了ptr
的值,并在返回main
后,我检查现在已更改的局部变量的值。
在myfunc
中,是否再次弹出压入变量tst
以更改其值?
3条答案
按热度按时间6pp0gazn1#
不,tst不会再次“出栈”。myfunc只是接收tst在堆栈中所处的地址,并在该地址更新内存。
请注意,将指针指向自动(堆栈)变量并将它们放在全局变量中通常是个坏主意。函数一退出,指针就不再有效,但系统不会检测到这一点,因此内存可能会损坏。在这种情况下不是问题,但也不是一个好习惯。
qoefvg9y2#
当一个函数被调用时,并不是所有的变量都被压入栈中,只有那些作为函数参数的变量才会被压入栈中,即:括号中的数字,像这样:
myfunc(arg);
。在这种情况下,arg
将被压入堆栈,以便在myfunc
中使用。关键是要记住,在C中,压入的只是变量中的值,而不是变量本身。你可能在找这样的东西
uxhixvfz3#
因为ptr是全局的,所以当你让它指向函数内部的某个对象时,它会全局地指向那个对象的内存位置。
您正在更新
myfunc()
中该内存位置的内容,然后访问main()
中的相同内存位置,因此显然您在myfunc()
中所做的更改是可见的。