c - 本地指针存储在内存中的什么位置?

标签 c pointers

我是 C 的初学者。我有一个程序如下:

int main()
{
    char* func();
    char *c;
    c = func();
    printf("%s", c);
}

char* func()
{
    char *ptr = "OK";
    return ptr;
}

众所周知,ptrfunc()的局部变量,是一个指针。范围是局部的。 但是当 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/

相关文章:

c - 动态数组的收缩因子?

c - 如何修复 C99 中的隐式声明错误?

c - 如何从末尾删除 C 中控制台上打印的当前行?

c++ - 指向类的指针的C++函数不起作用?

c++ - 帮助缓存局部化的载体吗? (C++)

c - 如何在 C 中分配 "optind"?

c - 在C中修改rindex

c++ - 检查指针是否指向数组

c - 如何评估 c 中的结构并通过指针变量给出输入?

pointers - 通过类型/种类/等级以外的方式区分 Fortran 中的泛型