C提高_day03_二级指针做输入第3种内存模型

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void main()
{
    int i = 0, j = 0;
    char **p2 = NULL;
    int num = 5;
    char *tmp = NULL;
    char tmpbuf[100];   //交换内存,必须申请一块buf
    p2 = (char **)malloc(sizeof(char *) * num);

    for (i=0; i<num; i++)
    {
        p2[i] = (char *)malloc(sizeof(char)  * 100  ); //char buf[100];
        sprintf(p2[i], "%d%d%d", i+1, i+1, i+2);
    }

    //排序之前 
    printf("排序之前
");
    for (i=0; i<num; i++)
    {
        printf("%s 
", p2[i]);
    }


    //排序 交换的是 :指针
    /*
    for (i=0; i<num; i++)
    {
        for (j=i+1; j<num; j++)
        {
            if (strcmp( p2[i] , p2[j]) < 0)
            {
                tmp = p2[i];
                p2[i] = p2[j];
                p2[j] = tmp;
            }
        }
    }
    */

    //排序 交换的时候内存         
    for (i=0; i<num; i++)
    {
        for (j=i+1; j<num; j++)
        {
            if (strcmp( p2[i] , p2[j]) < 0)            // strcmp(s1,s1),   s1=s2返回0;s1<s2返回负数;s1>s2返回正数
            {
                strcpy(tmpbuf, p2[i]);
                strcpy( p2[i], p2[j]);
                strcpy( p2[j], tmpbuf);
            }
        }
 }
    

    //排序之前 
    printf("排序之后
");
    for (i=0; i<num; i++)
    {
        printf("%s 
", p2[i]);
    }

    //释放内存
    for(i=0; i<num; i++)  // 先释放一维的再释放molloc的
    {
        if (p2[i] != NULL)
        {
            free(p2[i]);
            p2[i] = NULL;
        }
    }

    if (p2!=NULL) 
    {
        free(p2);
    }

    printf("hello...
");
    system("pause");
    return ;
}

封装成函数:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char **getMem41(int num)
{
    int i = 0;
    char **p2 = NULL;
    p2 = (char **)malloc(sizeof(char *) * num);
    if (p2 == NULL)
    {
        return NULL;
    }

    for (i=0; i<num; i++)
    {
        p2[i] = (char *)malloc(sizeof(char)  * 100  ); //char buf[100];
        sprintf(p2[i], "%d%d%d", i+1, i+1, i+1);
    }
    return p2;
}

void printMyArray03(char **myArray, int num)   //第三种内存模型和第一种内存模型 p+1 是通用的
{
    int i = 0;
    for (i=0; i<num; i++)
    {
        //printf("%s 
", myArray[i]);
        printf("%s 
", *(myArray+i) );
    }
}

void sortMyArray03(char **myArray, int num)
{
    int i =0 , j = 0;
    char *tmp = NULL;
    //排序
    for (i=0; i<num; i++)
    {
        for (j=i; j<num; j++)
        {
            if (strcmp(myArray[i], myArray[j]) < 0)
            {
                tmp = myArray[i];  //注意  交换的是数组元素 交换的是指针的值 //改变指针的指向
                myArray[i] = myArray[j];
                myArray[j] = tmp;
            }
        }
    }
}

void getMem41_Free(char **p2, int num)
{
    int i = 0;
    //释放内存
    for(i=0; i<num; i++)
    {
        if (p2[i] != NULL)
        {
            free(p2[i]);
            p2[i] = NULL;
        }
    }

    if (p2!=NULL) 
    {
        free(p2);
    }

}


void main()
{
    char **p2 = NULL;
    int  num = 5;
    
    p2 = getMem41(num);

    //排序之前 
    printf("排序之前
");
    printMyArray03(p2, num);


    sortMyArray03(p2, num);
    

    //排序之后 
    printf("排序之后
");
    printMyArray03(p2, num);


    getMem41_Free(p2,  num); //p2是一个野指针
    printf("hello...
");

    system("pause");
    return ;
}

03_第三种内存模型

Stay hungry,Stay foolish
原文地址:https://www.cnblogs.com/zhesun/p/4972836.html