深入理解《字符指针与字符数组真正的区别》

来自: 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, 

原文地址:https://www.cnblogs.com/renrenbinbin/p/4444618.html