內存四區:代碼區、數據區、棧區、堆區


 

本文轉載於:https://www.cnblogs.com/kelamoyujuzhen/p/11069620.html

代碼演示常量區

復制代碼
#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; }
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM