首页 > 解决方案 > 堆上的字符串指针与调用函数的堆栈

问题描述

我编写了以下基本 C 程序来打印字符串并了解一些关于内存的知识:

#include <stdio.h>

char * get_string() {
    char * s = "OK";
    return s;
}

int main(void) {
    char * string = get_string();
    printf("String: %s\n", string);     
    return 0;
}

这有效并打印:

字符串:好的

我的问题是为什么这行得通?例如,inget_string()不是s存储到堆栈而不是堆中的变量,为什么该变量在传递回主函数时没有“消失”?malloc如果不调用被调用函数,怎么能做到这样的事情get_string()呢?

标签: c

解决方案


不,它存储在全局数据部分中。

如果您将该行替换为:

char s[] = "OK";

那么您的程序将无法运行。

具体来说,这个字符串存储在程序文件的数据中,函数实际上是返回一个指向该数据存储位置的指针。


推荐阅读