内存四区:堆区 栈区 代码区 全局区
2023-09-27 14:23:59 时间
代码演示常量区
#include<iostream> using namespace std; const char* getstr1() { const char* str1 = "hello"; return str1; } const char* getstr2() { const char* str2 = "hello"; return str2; } int main(int argc, char* argv[]) { const char* p = getstr1(); const char* q = getstr2(); cout << "p=" << p << " " << "addr=" << static_cast<const void*>(p)<<endl; cout << "q=" << q << " " << "addr=" << static_cast<const void*>(q)<<endl; return 0; }
代码演示栈区
#include<iostream> using namespace std; char* getstr1() { char str1[] = "hello"; return str1; } char* getstr2() { char str2[] = "hello"; return str2; } int main(int argc, char* argv[]) { char* p = getstr1(); char* q = getstr2(); cout << "p=" << p << " " << "addr=" << static_cast<const void*>(p) << endl; cout << "q=" << q << " " << "addr=" << static_cast<const void*>(q) << endl; return 0; }
p,q指向内容乱码很好理解,但是p q 的指向的地址是一样的,这是因为“hello”在.rdata区。还有一种情况,char *p = "hello"; hello也在.rdata区。二者区别如下
char str[] = "hello" 这里面str不是指针,他是数组,所以不会像指针一样存在指向问题。编译器会把常量区的串 “hello”拷贝到对应栈帧。
把p q本身的地址打印出来
发现p q在main对应的栈帧中的确占了2个内存空间。但奇怪的是怎么p q 指向的内存一样呢?其实这里的一样完全是巧合,因为getstr1 getstr2实现完全一样,导致"hello"这个串在栈帧的位置也是一样的。
一般在函数调用的时候,会根据调用规则 有不同压栈规则,这就是说函数内定义的东西是局部于栈帧的。所以str1 和str2 是两个栈帧里面的东西。
稍微改变一下getstr2,p q 的地址就不一样了
参考:剖析.o文件ELF组成
代码演示堆区
#include<iostream> #include<cstring> using namespace std; char* getstr1() { char* str = (char*)malloc(sizeof(char) * 6); char buf[] = "hello"; strcpy_s(str,6, buf); return str; } char* getstr2() { char* str = (char*)malloc(sizeof(char) * 6); char buf[] = "hello"; strcpy_s(str,6, buf); return str; } int main(int argc, char* argv[]) { char* p = getstr1(); char* q = getstr2(); cout << "p=" << p << " " << "addr=" << static_cast<const void*>(p) << endl; cout << "q=" << q << " " << "addr=" << static_cast<const void*>(q) << endl; return 0; }
相关文章
- redis实战笔记(9)-第9章 降低内存占用
- Lua性能优化—Lua内存优化
- 聊聊我对Java内存模型的理解
- 5G的7位电话号码,去重,内存20mb,代码实现。
- 指令和数据都用二进制代码存放在内存中,从时空观角度回答CPU如何区分读出的代码是指令还是数据
- 《操作系统真象还原》——0.8 代码中为什么分为代码段、数据段?这和内存访问机制中的段是一回事吗
- linux 在 1 MB 之下的 ISA 内存
- 内存映射
- 华为OD机试 - 简易内存池2(JS)| 真题+思路+考点+代码
- 华为OD机试 -简易内存池2(Java) | 机试题+算法思路+考点+代码解析 【2023】
- Android内存优化(五) Lint代码扫描工具
- 内存复用
- c语言内存操作优化
- C语言学习笔记——内存
- 利用图文和代码深度解析操作系统OS的内存管理实现原理机制和算法
- linux清理内存命令
- HPE发布第10代ProLiant服务器 加强安全固件和永久内存