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

声明局部变量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\n", myArray[i]);// printf("%s\n", *(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("\nhehhe");
  system("pause");
  return;
}

原文地址:https://www.cnblogs.com/fengxing999/p/10320382.html

时间: 2024-10-10 05:17:51

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

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

#include <stdlib.h> #include <string.h> #include <stdio.h> //打印 排序 //封装成函数 void main() { int i = 0, j = 0; int num = 4; char tmpBuf[30]; char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111

二级指针做输入的第一种模型

1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 6 void printNum(char **array, int num) 7 { 8 int i = 0; 9 for (i = 0; i < num; i++) 10 { 11 printf("%s ", array[i]); 12 } 13 }

二级指针做函数的输入与输出

本文将介绍二级指针做函数输出以及做函数输入的三种内存模型从内存四区的角度对程序执行的过程进行剖析,通过这中方式来加深对指针的理解. 二级指针做输出(在被调函数中分配内存)模型: 主函数: int main() { char *p = NULL; int len = 0; getMem(&p, &len); printf("p=%s\n", p); FreeMem(&p); return 0; } getMem函数: int getMem(char **myp,i

Apache三种MPM模型简介及应用

MPM是apache的多道处理模块,用于定义apache对客户端请求的处理方式.在linux中apache常用的三种MPM模型分别是prefork.worker和event. prefork: 预先生成进程,一个请求用一个进程响应.Apache2.2版本默认使用prefork模型.优点:稳定可靠.执行效率高,任何一个进程的崩溃不会影响其它请求.缺点:在大并发的时候对服务器资源消耗严重. worker: 基于线程的处理方式,一个进程生成多个线程,一个请求用一个线程响应.由于使用线程访问,多个线程共

阿里Java开发工程师理解的三种架构模型

常用的软件架构模型可以归类为三种架构模型:3/N层架构."框架+插件"架构.地域分布式架构. 一.三种架构模型 1.3/N层架构 这是经典的多层架构模型,对于稍微复杂一点或特别复杂的系统,不使用分层架构是很难想象的.下图是经典的3层架构: 如今,凡是个程序员都能侃侃而谈3/N层架构,这确实是解决系统复杂性的一种主流模式,但是,只要采用了3/N层架构是不是就一定能解决系统的复杂性了?不一定,关键在于你在你的系统中如何实作你的3/N层结构. 在采用了3/N层架构后,我们还是要解决以下非常重

(转)maven怎么 引入(或引用/使用) 自定义(或本地/第三方) jar的三种方式 图文教程 方法二最简单

转:https://blog.csdn.net/wabiaozia/article/details/52798194 准备工作: 假如我有一个自定义jar是:123456.jar,下载地址http://download.csdn.net/detail/wabiaozia/9870838 如果不想下载,可以按照https://jingyan.baidu.com/article/046a7b3ed8b23ef9c27fa9b9.html 操作即可得到jar. jar包里的源码是: public cl

VMware三种上网模型

今天捣鼓了一会虚拟机,对上网方式又学习了一遍,之前摆弄过,现在又捡起来了,主要自己整理一下,方面后面复习.主要有三种网络模型:桥接.仅主机(Host-Only).NAT.自己亲测了这三种方式,都可以上网. 说明: 配置:Win7 64位+VMware10.0+Ubuntu14.04. 网络模型:VMnet0是VMware用于虚拟桥接网络下的虚拟交换机; VMnet1是VMware 用于虚拟Host-Only 网络下的虚拟交换机: VMnet8是VMware用于虚拟NAT网络下的虚拟交换机. 里面

LINUX环境并发服务器的三种实现模型

服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器.按处理方式来分有循环服务器和并发服务器. 1  循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求,对服务端的程序就提出了特殊的要求. 目前最常用的服务器模型有: ·循环服务器:服务器在同一时刻只能响应一个客户端的请求 ·并发服务器:服务器在同一时刻可以响应多个客户端的请求 1.1 UDP循环服务器的实现方法: UDP循环服务器每次从套接字上读取一个客户端的请求->处理->然后将

Linux 网络编程——并发服务器的三种实现模型

服务器设计技术有很多,按使用的协议来分有 TCP 服务器和 UDP 服务器,按处理方式来分有循环服务器和并发服务器. 循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器(多对一),为了处理客户的请求,对服务端的程序就提出了特殊的要求. 目前最常用的服务器模型有: ·循环服务器:服务器在同一时刻只能响应一个客户端的请求 ·并发服务器:服务器在同一时刻可以响应多个客户端的请求 UDP 循环服务器的实现方法 UDP 循环服务器每次从套接字上读取一个客户端的请求 -> 处理