三级指针四级存储空间的开辟~

三级指针四级存储空间

2015-05-15  青岛  张俊浩

今天在技术问答板块看到的帖子,花时间调出来,也顺便整理作为笔记~

原帖是:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char*** Create3DActiveArray(int x, int y, int z)
{
    char ***pArr;
    int i, j,k;
    pArr = (char ***)malloc(x * sizeof(char **));

    for (i = 0; i < x; i++)
    {
        pArr[i] = (char **)malloc(y * sizeof(char *));
        for (j = 2; j < y; j++)
        {
           pArr[i][j] = (char *)malloc(z * sizeof(char));
           for (k = 0; k < z; k++)
           {
              pArr[i][j][k] = 0;
           }
        }
    }
    return pArr;
}
void Free3DActiveArray(char ***pArr, int x, int y)
{
    int i, j, k;
    for (i = 0; i < x; i++)
    {
        for (j = 0; j < y; j++)
        {
            free(pArr[i][j]);
            pArr[i][j] = NULL;
        }
        free(pArr[i]);
        pArr[i] = NULL;
    }
    free(pArr);
}
int main(){
    char ***table=Create3DActiveArray(2,2,100);
    strcpy(table[0][0],"num");
    printf("%s",table[0][0]);
    return 0;
}
//求解答呀,会出现段错误

额,感觉这类程序非常有意思,能强化内存意识~这里是三级指针,意味着内存四级存储空间,级与级之间不一定是连续的,级内是连续的(从虚拟地址来说)~所以你无法用pArrp[i][j][k]访问方式~

附上内存分布图和修改的部分代码~

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Create3DActiveArray(char**** pArr,int x, int y, int z)
{
//    char ***pArr;
	char ***pArr3Temp;//二级指针数组指针游标
	char ** pArr2Temp;//一级指针数组指针游标
	char *  pArr1Temp;//字符数组指针游标
<span style="white-space:pre">	</span>int i, j,k;
<span style="white-space:pre">	</span>*pArr = (char ***)malloc(x * sizeof(char **));
	pArr3Temp =*pArr;

    for (i = 0; i < x; i++)
    {
	//	pArr1Temp = *pArr2Temp;
        *pArr3Temp = (char **)malloc(y * sizeof(char *));
		pArr2Temp = *pArr3Temp;

        for (j = 0; j < y; j++)//之前写j=2?why?
        {

           *pArr2Temp = (char *)malloc(z * sizeof(char));
		   pArr1Temp = *pArr2Temp;
           for (k = 0; k < z; k++)
           {
              *pArr1Temp = 0;
			  ++pArr1Temp;//遍历字符指针数组
           }
		   ++pArr2Temp;//遍历一级指针数组
        }
		++pArr3Temp;//遍历二级指针数组
    }
 //   return pArr;
}

int main(){
    char ***table;
    Create3DActiveArray(&table,2,2,4);
    strcpy((*(*table)),"num");
    printf("%s\n",*(*table));
    return 0;
}
时间: 2024-10-12 16:00:40

三级指针四级存储空间的开辟~的相关文章

三级指针的应用场景

1.问题:将指针数组和二维数组中的字符串存放到第三个指针所指向的内存空间中,并进行排序(默认升序)输出,必须通过函数来完成. (1).代码如下: #include<stdio.h> #include<string.h> #include<malloc.h> void destorySpace_2(char ***p3, int len3); void destorySpace_1(char **p3, int len3); int sort(char **myp1, i

三级指针

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

C语言 三级指针的应用

//三级指针的使用 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> //三级指针做输出 int getmun(char ***pout/*out*/,int *num){ int ERRO_MSG = 0; if (pout==NULL) { ERRO_MSG = 1; printf("危险操作内存pout==NULL erro

指针的美丽传说

一.浅谈指针 说起指针,不知道有多少的C学者被这座大山所困住,很多人都说数组是最难学的,但是没想到指针比数组还难.没听多久就完全被绕晕了,什么一级指针啊,二级指针啊,三级指针啊,最后还莫名其妙的出来一个n级指针,就这样一节课下来就完全晕了.当然这里面还包括一些和指针搭配用的伙伴.数组.函数.结构体等等,我接下来说的可能只是指针的皮毛,你们也可以认为是概念,所以我希望你们看看就行,具体还要自己去想. 1.指针是什么呢?说白了其实是地址,说的再通俗点也就是门牌号,因为你如果需要找到某人的家,是否要先

C语言(四)指针概念的理解

转载请标明出处: http://blog.csdn.net/u011974987/article/details/52270018: 前言 最近真的是忙的不可开交,公司一直给安排任务,连学习和写笔记的时间都没有了,落下好几次课的笔记都没有写,所以我抽空把目前的进度给追上来,不然会越落越多.加油吧~(感觉身体都要被掏空了) 指针 我们通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,学习指针是很有必要的. 正如您所知道的,每一个变量都有一个内存位

5.疯狂指针-贰

转载请标明出处:http://blog.csdn.net/u012637501 多级指针 指针变量保存的是指向变量地址,有点需要区别: 1. 数据类型 * 变量名:* 表示该变量为指针变量,存放的是(数据类型)变量的存储地址,如int *p=&i; 2. * 指针变量:*表示指向"以指针变量的内容为存储地址的变量",如*p=i; §举例1:多级指针的关系 #include <stdio.h> int main(void) { int i = 10;         

「C」 数组、字符串、指针

一.数组 (一)数组 概念:用来存储一组数据的构造数据类型 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. (二)数组的定义 格式: 类型 数组名[元素个数]: 举例:存储5个人的年龄 int agrs[5];  // 在内存中开辟4x5=20个字节的存储空间 可以在定义数组的同时对数组进行初始化: int ages[5] = {17,18,19,20,21}: 遍历数组: for(int i = 0;i<5;i++) { printf(“ages[%

黑马程序员---C基础9【字符串的输入输出】【字符串相关函数】【指针】【指针变量初始】【二级指针】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [字符串的输入输出] 1.字符串输出: %s-------从给定的地址开始输出字符直到遇到\0停止: printf("%s\n",&a[3]);  printf("%s\n",a); char a[]="hellowo\0rd!"; 2.字符串输入: 从键盘上接收一个字符串,保存在以a为首地址的字符数组中 scanf("%s&

深入理解 [指针函数] 、[函数指针]、[指针的指针]、[指向指针数组的指针]

指针函数 1.指针函数是指带指针的函数,即本质是一个函数.当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中. 函数返回类型是某一类型的指针: 格式: 类型标识符  *函数名(参数表) int *match(void *key_x,void *key_y); 解析:首先来说它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针