我是 C 的初学者。我有一个程序如下:
int main()
{
char* func();
char *c;
c = func();
printf("%s", c);
}
char* func()
{
char *ptr = "OK";
return ptr;
}
众所周知,ptr
是func()
的局部变量,是一个指针。范围是局部的。
但是当 ptr
返回给调用者 main
时,它仍然有效,并且当打印 c
时,它打印“OK”。
这怎么可能? ptr
存放在哪个内存段;栈还是堆?
最佳答案
这就是使用指针时发生的事情(请注意,指针就像名字所暗示的那样,有点像指向某物的手指)。
让我们分解您的代码并一点一点地理解它。 在你的 main 函数中,你声明了一个字符指针 *c
char *c;
然后你这样做了:
c = func();
它告诉 c 指针指向此 func() 指向的任何内容。
让我们看看你的功能
char* func()
{
char *ptr = "OK";
return ptr;
}
第一行,再次声明一个字符指针ptr,并将“OK”分配给该地址(注意:指针只是指向某个内存地址)。所以现在,该地址包含字符串“OK”(或更准确地说,一个 char 数组)。
然后你返回ptr,它是“OK”所在的地址。请注意,因为 ptr 是在 func() 中声明的,所以它是一个局部变量。因此,一旦返回,它就会从堆栈中移除(噗!消失了)。
但是,因为在您的 main() 中:
c = func();
变量c指向“OK”所在的地址。因此,即使变量 ptr 不再存在,变量 c 知道它在哪里,并且仍然可以访问“OK”。
回答你的问题:
- ptr 存储在栈
- 当您退出 func() 时,ptr 会从堆栈中弹出
关于c - 本地指针存储在内存中的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11481114/