先以一個前輩寫的經典開頭:
//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)存儲區域不同
數組存儲在棧中;
字符串常量存儲在全局變量區。
同時,數組存儲的變量可以修改,但是字符串常量不可以修改。
小結:
堆和棧的區別可以用如下的比喻來看出:
使用棧就象我們去飯館裏吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就
走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自
由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由
度大。 (經典!)