字符串数组的三种内存模型

第一种情况是,例如

char *p[] = {"abc", "123", "kkii"};

本质是定义了一个指针数组,其中有三个字符指针,指针分别指向全局区的某个字符串的首地址。内存模型如下:

第二种情况是,例如:

char p[3][4] = {"abc", "123", "jkl"};

其本质是在栈区开辟了一个字符串数组,它分成了三个内存区域,每个内存区域含有一个字符串,最大长度不超过3,内存模型如下:

第三种情况,例如:

int i ;

char **p = NULL;

p = (char **c)malloc(sizeof(char *) * 3);

for(i = 0;i < 3; ++i){
  p[i] =  (char *)malloc(sizeof(char) * 4);
}
p[0] = "abc";

p[1] = "123";

p[2] = "jkl";

其本质是现在栈区分配一个指针变量p,指向堆区一块3个指针大小的内存,并且分配了三个指针,其三个指针分别指向一个字符串的首地址,如图:

原文地址:https://www.cnblogs.com/zhouquan-1992-04-06/p/6209030.html