从C++指针定义字符串和数组定义字符串区别到C++堆和栈区别

来源:互联网 发布:mac双系统无法切换 编辑:程序博客网 时间:2024/06/17 14:09

先以一个前辈写的经典开头:

//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)存储区域不同

数组存储在栈中;

字符串常量存储在全局变量区。

同时,数组存储的变量可以修改,但是字符串常量不可以修改。

小结:

 堆和栈的区别可以用如下的比喻来看出:    
  使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就  
  走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自  
  由度小。    
  使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由  
  度大。   (经典!)  





0 0