• 二级指针做输入的第三种内存模型:手工打造二维内存


    声明局部变量p, p指向一段内存地址,这段内存地址存放这N个指针,每个指针都指向malloc的另一段内存。

    内存模型图如下:

    p应该是二级指针

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include<ctype.h>

    char**getMem(int num)
    {

      int i = 0, j = 0;
      char** p2 = NULL;
      if (p2 == NULL)
      {
        return NULL;
      }
      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 + 1);//向内存空间中打印数据
      }

      return p2;
    }

    //打印
    void printMyArray03(char**myArray, int num)
    {
      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 + 1; j < num; j++)
        {
          if (strcmp(myArray[i], myArray[j]) > 0)//前面的大 交换
          {
            //交换的指针指向
            tmp = myArray[i]; //注意 交换的是数组元素 交换的是指针的值 //改变指针的指向
            myArray[i] = myArray[j];
            myArray[j] = tmp;
          }
        }
      }
    }

    //释放
    void getMem03_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);
        p2 = NULL;
      }

    }
    void main()
    {
      int i = 0, j = 0;
      char** p2 = NULL;
      char*tmp;
      char tmpbuf[100];
      int num = 5;
      p2 = getMem(num);

      //打印
      printMyArray03(p2, num);

      //排序
      //交换指针指向
      sortMyArray03(p2, num);

      printMyArray03(p2, num);

      //释放内存 先申请的后释放
      getMem03_Free(p2, num); //释放完后 实参main函数的p2还是一个野指针

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

      printf(" hehhe");
      system("pause");
      return;
    }

  • 相关阅读:
    yeoman+grunt/gulp+bower构建angular项目
    eclipse配置svn 并从svn下载maven项目 配置tomcat启动maven项目(二)
    eclipse配置svn 并从svn下载maven项目 配置tomcat启动maven项目
    mysql Oracle常用使用区别
    海思平台交叉编译curl支持SSL功能
    Gitlab 自动构建心得
    openssl windows平台编译库
    更换树莓派源成国内源
    使用ntp协议同步本地时间(C语言)
    网络分析纪录
  • 原文地址:https://www.cnblogs.com/fengxing999/p/10320382.html
Copyright © 2020-2023  润新知