三级指针的应用场景

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, int len1, char (*myp2)[30], int len2, char ***myp3, int *len3);

int sort(char **myp1, int len1, char (*myp2)[30], int len2, char ***myp3, int *len3){
    int len;
    int i;
    int j;
    char **p3 = NULL;
    int temLen;
    char *tmp1;

    len = len1 + len2;
    p3 = (char **)malloc(sizeof(char *) * len);

    //先将第一个指针数组的内容拷贝到p3所指向的空间中
    for(i = 0; i < len1; i++){
        temLen = strlen(myp1[i])+1;
        p3[i] = (char *)malloc(sizeof(char) * temLen);
        strcpy(p3[i], myp1[i]);
    }
    //先将第二个二维数组的内容拷贝到p3所指向的空间中
    for(j = 0; j < len2; j++, i++){
        temLen = strlen(myp2[j])+1;
        p3[i] = (char *)malloc(sizeof(char) * temLen);
        strcpy(p3[i], myp2[j]);
    }

    //最后对p3所指向的空间的字符串在进行排序;
    for(i = 0; i < len; i++){
        for(j = i+1; j < len; j++){
            if(strcmp(p3[i], p3[j]) > 0){
                tmp1 = p3[i];
                p3[i] = p3[j];
                p3[j] = tmp1;
            }
        }
    }

    *myp3 = p3;
    *len3 = len;

    return 0;
}   
//销毁p3所指向空间的第一种方法,自己必须在调用下面对p3 = NULL;
void destorySpace_1(char **p3, int len3){
    int i;

    if(p3 != NULL){
        for(i = 0; i < len3; i++){
            if(p3[i] != NULL){
                free(p3[i]);
            }
        }
        free(p3);
    }
} 
//销毁p3所指向空间的第二种方法
void destorySpace_2(char ***p3, int len3){
    int i;
    char **p;

    if(p3 == NULL){
        return;
    }
    p = *p3;
    if(p != NULL){
        for(i = 0; i < len3; i++){
            if(p[i] != NULL){
                free(p[i]);
            }
        }

        free(p);
        *p3 = NULL;
    }
}
int main(void){
    char *p1[] = {"aaaaa", "bbbbb", "ccccc", "eeeeeee"};
    char buf1[][30] = {"fffff", "kkkkkkk"};
    char **p3;
    int len1;
    int len2;
    int len3;
    int ret;
    int i;

    len1 = sizeof(p1)/sizeof(p1[0]);
    len2 = sizeof(buf1)/sizeof(buf1[0]);

    ret = sort(p1, len1, buf1, len2, &p3, &len3);
    if(ret != 0){
        printf("sort() err\n");
        return ret;
    }

    for(i = 0; i < len3; i++){
        printf("%s\n", p3[i]);
    }
   //destorySpace_2(&p3, len3);
    destorySpace_1(p3, len3);
    p3 = NULL;

    return 0;
}

(2)、运行结果:

(3)、模型分析

  思想:因为要用函数完成,对二维数组和指针数组中的字符串先进行存放到p3所指向的空间中,就必须的使用三级指针来接收了,然后在对其所指向的空间进行排序!

  在进行空间的释放时,要是在函数内部避免野指针问题,就必须的用三级指针来接收了!

  在进行空间的释放时,要是用二级指针来接收的话,则自己必须在调用的下面对其进行赋空,避免野指针的出现,原因:2个指针空间的值没有半毛钱的关系(它们之间仅仅是形参、实参的对应关系)!!!

抛出问题的代码:

//函数调用
destorySpace(char **p3){
    ......
    p3 = NULL;
}
//主函数
int main(void){
    char **p3 = NULL;
    ...
    destorySpace(p3);
}

模型如下:

时间: 2024-08-28 18:36:23

三级指针的应用场景的相关文章

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

三级指针四级存储空间 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(

三级指针

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基础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&

第5课 C语言指针深入1

1.客户端两种主流的接口模型: #ifndef _SOCKETCLINET_H #endif _SOCKETCLINET_H #ifdef __cplusplus //如果用了C++的编译器,用C语言的规范来引用 extern "C" { #endif //socket客户端环境初始化 int socketclient_init(void** handle); //socket客户端报文发送 int socketclient_send(void* handle, unsigned ch

C/C++心得-理解指针

上一篇笔者用那不是怎么好理解的逻辑介绍了内存和C中的基本数据类型,现在笔者再根据自己重新所学来说说C语言中的指针. 理解指针才能真正的算C语言入门.也许是我大学期间太关注前端UE,也许是当初开始学C语言的时候没怎么认真:直到毕业后的某一天我才“懂”指针,才算理解C语言的伟大.如果早点理解它,可能我毕业时就会选择一份不一样的工作.如果有初学C语言的同行对指针有困惑,希望我这浅薄的认识能帮助你. 1.简介 指针在原英文中为pointer,个人觉得翻译过来后针的含义不如指的含义好理解,pointer还

C语言07指针高级

01内存四区 接口封装和设计思想引导 接口封装设计思想引导 Sckclient客户端api模型设计 第一套api函数 #ifndef _SCK_CLINT_H_ #define _SCK_CLINT_H_ //函数声明 // 1.client环境初始化 int sckClient_init(void **handle); //5 day // // 2.client发送报文 int sckClient_send(void *handle, unsigned char *data, int dat

C之指针

什么是指针 * 指针变量:用来存储某种数据在内存中的地址.* 世面上书籍一般把指针和指针变量的概念混在一起了.市面上的书籍说的指针指的就是指针变量 ? *号的三种含义1. 两个数相乘int i =5;int j = 5;i*j; 2. 基本类型* 表示这种类型的指针变量- 指向内存中这种类型的变量的地址int i= 3:int* p;可以存放i的地址p=&i 3. 指针变量前加* 表取出这个指针变量里的数据 int* p; *p 把地址里的数据取出来 指针常见错误 * 野指针:指针变量没有定义指

C语言中多级指针的重点分析

一.指针简介        指针是C语言的灵魂,C语言之所以强大,很大一部分原因在于对指针的灵活运用.我们无论需要对内存的精准分配和释放,还是对接口api的使用,乃至面向对象中的类和对象的封装,都涉及到了指针.C语言的指针大致可以分为两种,一种是作为一个变量,其保存的是一段内存地址,也就是本文要谈的多级指针:另一种是作为一种数据类型,像函数指针,用于引出一种类型,主要用于回调函数. 二.指针与基础数据类型 从内存的角度看,数据类型就是一段固定大小内存块的别名. int a=0; int在32/6