二级指针和内存四区的模型
看了一下前面写的关于指针见解,以及关于内存四区的见解,然后感觉写的不是特别清楚,然后自己就画了一张图来表示他们之间的关系,我想如果能看懂我这张图,内存四区以及二级指针差不多就明白了;下面先上代码:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include3 #include <string.h> 4 #include 5 6 void main() 7 { 8 int i = 0; 9 //第一种:指针数组 10 char *a[] = {"aaa","bbb","cccc"}; 11 12 //二维数组 13 char b[3][4] = {"111","bb","333"}; 14 15 //二级指针:手工的分配内存空间 16 char **c = (char **)malloc(sizeof(char *) * 3); 17 18 for(i = 0 ; i < 3; i++) 19 { 20 c[i] = (char *)malloc(sizeof(char) * 4); 21 sprintf(c[i],"%d",i);//将i以字符串的形式写入到分配的空间中 22 } 23 24 system("pause"); 25 }
第一种是指针数组,即数组里储存的是一个个指针,这些指针全都指向了全局区,第二种是分配在栈区的二维数组,第三种是手工分配的内存空间;下面是关于这段代码的图;
假设在全局区中aaa的地址是0xa11,bbb的地址是0xa12,cccc的地址是0xa13,则指针数组a里面的指针则分别指向了0xa11,0xa12,0xa13这三个地址,二维数组则直接是在栈区分配的空间,所以可以直接把数据存入到栈区中,而第三种则是先为二级指针在堆区分配了三个一级指针,然后又在栈区分配了3个4个字节的空间,又将堆区的三个指针分别指向了它们。