来自: http://blog.csdn.net/on_1y/article/details/13030439 (这篇介绍的非常到位和透彻!!!)
char *p="hello"; char q[]="hello"; char *r = (char*)malloc(sizeof(char)*6);
我们知道,字符指针和字符数组,都可以用来存储和表达字符串。
但,它们的实现方式是不同的! 下面,从代码初始化的角度,来分别说明。
(1) char *p="hello";
对于p本身,它是一个局部变量,位于 user stack 区域。
p指向的 “hello” 是一个固定的,不可改变的常量,具有静态存储连续性数组类型,C++称它为“string literal”,位于.rodata 区域(位于该区域的数据是read-only)
变量p中存储的是“hello”的首地址。
(2) char q[]="hello";
对于q本身,位于 user stack 区域。
q表示的是一个数组,存储的是一个固定不可改变的常量:为数组对应内存空间的首地址。也就是说q是一个指针常量。
数组对应的内存单元位于 user stack 区域,在初始化时,编译器计算出数组大小,然后将“hello”中的字符存储到数组中对应的单元。
(3) char *r = (char*)malloc(sizeof(char)*6)
对于r本身,位于 user stack 区域。
r指向的内存单元,位于run-time heap中。 因为malloc、new等在运行时开辟的内存都位于heap中。
具体位置如下图。
并行 VS 并发
未初始化和非法指针。
指针和数组的问题。。。。*p cout is t, p=="tencent" is ok,