我是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存储哪个存储段; 堆栈还是堆?
这是使用指针时的内幕(请注意,指针就像名称所暗示的那样,就像手指指向某个东西).
让我们分解您的代码并逐步理解它.在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".
回答你的问题:
该文本"OK"存储在可执行文件的常量数据部分中(在进程启动时加载到内存中)。虽然ptr是局部变量,但编译器将其初始化为指向"OK"存储在其他地方的 。当您返回ptr到调用者时,指针仍然指向相同的"OK".
| 归档时间: |
|
| 查看次数: |
8729 次 |
| 最近记录: |