从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)存储区域不同
数组存储在栈中;
字符串常量存储在全局变量区。
同时,数组存储的变量可以修改,但是字符串常量不可以修改。
小结:
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就
走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自
由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由
度大。 (经典!)
- 从C++指针定义字符串和数组定义字符串区别到C++堆和栈区别
- 指针定义字符串和数组定义字符串的区别
- C语言指针字符串和数组字符串的一点区别
- C语言定义字符串和字符数组
- C指针和数组:定义为字符串指针,声明为字符数组的后果
- C语言中“指针”和“指针变量”区别及定义
- C Java 字符串和字符数组区别
- 字符串指针和字符串数组的区别
- 字符串数组和字符串指针的区别
- 字符串指针和字符串数组的区别
- 指针字符串 和 数组字符串的区别
- 字符串数组 和 字符串指针 的区别
- 字符串定义:s[]和*s 的区别
- c语言中float、double的区别和用string定义字符串反置
- java和c语言中数组定义初始化的区别
- linux c 字符数组指针和字符串指针(区别代码段)
- 字符数组和字符串,char 和string定义的字符串的区别与遍历
- 字符数组和字符串,char 和string定义的字符串的区别与遍历
- 剑指offer-面试题28 字符串的排列
- 漫谈设计模式之抽象工厂模式(Abstract Factory)
- python调用wcf服务
- 验证码生成
- Verilog 程序输出0 1 2 3 3 2 1 0 0 1 2 3 3 2 1 0.....
- 从C++指针定义字符串和数组定义字符串区别到C++堆和栈区别
- 更改UITextField的placeholder文字颜色的5种方法
- Android中Service与多个Activity通信
- 剑指offer-面试题28_3 八皇后问题
- Zookeeper完全分布式安装教程
- ajax请求时session已过期处理方案
- [Jquery] 当 radio 的 checked="checked" 无法再次使用 attr("checked","checked")
- ssh client 报 algorithm negotiation failed的解决方法之一
- MPU6050的数据获取、分析与处理