c - 堆上的字符串指针与调用函数的堆栈
问题描述
我编写了以下基本 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()
呢?
解决方案
不,它存储在全局数据部分中。
如果您将该行替换为:
char s[] = "OK";
那么您的程序将无法运行。
具体来说,这个字符串存储在程序文件的数据中,函数实际上是返回一个指向该数据存储位置的指针。
推荐阅读
- c - C语言链表中的节点
- javascript - Chart.js 画布和图表宽度在重绘时被覆盖
- java - 从项目外部控制 recyclerView 项目对象
- java - 如何更改具有圆角半径的形状的背景?
- java - 我的 Spring Java 应用程序中的 Java 运行时错误
- mysql - 从弹性搜索和 MySQL 中加入数据以进行分页的最佳方法是什么?
- angular - 从后端部分以 Angular 接收数据时出现问题
- asp.net-mvc - 如何更改表EF MVC中特定记录中一列的值
- android - 具有 iOS 和 Android 共享权限设置的客户端数据管理器应用程序
- python - Keras:无监督的预训练会扼杀性能