本地指针存储在内存中的哪个位置?

rav*_*avi 4 c pointers

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

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

char* func()
{
    char *ptr = "OK";
    return ptr;
}
Run Code Online (Sandbox Code Playgroud)

众所周知,ptr是一个局部变量,func()是一个指针.范围是本地的.但是当ptr返回给调用者时main,它仍然有效,并且在c打印时,它会打印"OK".

这怎么可能?ptr存储哪个存储段; 堆栈还是堆?

Ari*_*ial 7

这是使用指针时的内幕(请注意,指针就像名称所暗示的那样,就像手指指向某个东西).

让我们分解您的代码并逐步理解它.在main函数中,您声明了一个字符指针*c

char *c;
Run Code Online (Sandbox Code Playgroud)

然后你这样做了:

c = func();
Run Code Online (Sandbox Code Playgroud)

它告诉c指针指向func()所指向的内容.

我们来看看你的功能吧

char* func()
{
    char *ptr = "OK";
    return ptr;
}
Run Code Online (Sandbox Code Playgroud)

第一行再次声明一个字符指针ptr,并为该地址指定"OK"(注意:指针只指向某个内存地址).所以现在,该地址包含字符串"OK"(或更准确地说,是一个char数组).

然后返回ptr,这是"OK"所在的地址.请注意,因为ptr是在func()中声明的,所以它是一个局部变量.因此,一旦返回,它就会从堆栈中移除(poof!Gone).

但是,因为在你的main()中:

c = func(); 
Run Code Online (Sandbox Code Playgroud)

变量c指向存储"OK"的地址.因此,即使变量ptr不再存在,变量c也知道它在哪里,并且仍然可以访问"OK".

回答你的问题:

  • ptr存储在堆栈中
  • 退出func()时,ptr从堆栈中弹出


Gre*_*ill 2

该文本"OK"存储在可执行文件的常量数据部分中(在进程启动时加载到内存中)。虽然ptr是局部变量,但编译器将其初始化为指向"OK"存储在其他地方的 。当您返回ptr到调用者时,指针仍然指向相同的"OK".