從C++指針定義字符串和數組定義字符串區別到C++堆和棧區別

先以一個前輩寫的經典開頭:

//main.cpp    
  int   a   =   0;   全局初始化區    
  char   *p1;   全局未初始化區    
  main()    
  {    
  int   b;   棧    
  char   s[]   =   "abc";   棧    
  char   *p2;   棧    
  char   *p3   =   "123456";   123456/0在常量區,p3在棧上。    
  static   int   c   =0;   全局(靜態)初始化區    
  p1   =   (char   *)malloc(10);    
  p2   =   (char   *)malloc(20);    
  分配得來得10和20字節的區域就在堆區。    
  strcpy(p1,   "123456");   123456/0放在常量區,編譯器可能會將它與p3所指向的"123456"  
  優化成一個地方。    
  }    

接下來開始說說:

char s[] = "Hello1";

char* s = "Hello2";

這兩個定義一樣嗎?

Of course NOT !!!

 Hello1是在運行時刻賦值的;    
 而Hello2是在編譯時就確定的;

這就涉及到堆和棧的區別了。

當然,兩者有區別,也有相同之處

相同之處:

對兩者求strlen()長度一致,都是5。

不同之處:

(1)存儲模型不同

數組存儲是:每個字母佔一個單元格,總共需要6個單元格

字符串存儲:創建一個名爲message的指針單元格,然後指向存儲“hello”這個字符串。

(2)sizeof()大小不同

數組存儲求sizeof()是6個字節

字符串存儲求sizeof()是4個單元格

(3)存儲區域不同

數組存儲在棧中;

字符串常量存儲在全局變量區。

同時,數組存儲的變量可以修改,但是字符串常量不可以修改。

小結:

 堆和棧的區別可以用如下的比喻來看出:    
  使用棧就象我們去飯館裏吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就  
  走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自  
  由度小。    
  使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由  
  度大。   (經典!)  





發佈了32 篇原創文章 · 獲贊 25 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章