先以一个前辈写的经典开头:
//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)存储区域不同
数组存储在栈中;
字符串常量存储在全局变量区。
同时,数组存储的变量可以修改,但是字符串常量不可以修改。
小结:
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就
走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自
由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由
度大。 (经典!)