//二级指针第二种内存模型#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//打印数组
int printfArr(char **pin,int *num){int ERRO_MSG = 0;if (pin==NULL){ERRO_MSG = 1;printf("pin==NULL erro msg:%d\n", ERRO_MSG);return ERRO_MSG;}if (num == NULL){ERRO_MSG = 2;printf("num == NULL erro msg:%d\n", ERRO_MSG);return ERRO_MSG;}int i = 0;for (i = 0; i < *num; i++){printf("%s\n", pin[i]);}return ERRO_MSG;
}//释放内存
int freeMalloc(char **pin, int *num){int ERRO_MSG = 0, i = 0;if (pin == NULL){ERRO_MSG = 1;printf("pin==NULL erro msg:%d\n", ERRO_MSG);return ERRO_MSG;}if (num == NULL){ERRO_MSG = 2;printf("num == NULL erro msg:%d\n", ERRO_MSG);return ERRO_MSG;}for (i = 1; i < *num; i++){if (pin[i]!=NULL){free(pin[i]);pin[i] = NULL;//防止产生野指针
        }}//在这里释放pArray的内存也是可以的,pin是pArray的一个副本,但是pin和pArray都指向同一块内存//free()是释放指针所指向的内存空间,//这还是有个缺点,给pin==NULL对pArray没有影响,还是可能产生野指针,//所以最好不要在被调用函数里释放/*if (pin != NULL){free(pin);}*/return ERRO_MSG;
}void main(){int num = 5;char ** pArray = (char **)malloc(num*sizeof(char *));memset(pArray, 0, num*sizeof(char *));//注释:malloc()函数是在堆上分配一块内存空间,返回这个内存空间的地址//100*sizeof( char *)是指分配了 100个 char *类型大小的内存空间//(char **)是将malloc()返回的内存空间地址 转化为一个char **类型的指针//char ** pArray 说明pArray指向的是一个char * 类型的数据,说明pArray的步长是 sizeof(char *) = 4//注意:这里计算机并不知道malloc()函数分配的内存从哪里结束,只知道分配的内存从哪里开始//所以 在进行 pArray+1 加法操作的时候一定要注意malloc()分配内存的大小,不要越界*(pArray + 0) = (char *)malloc(sizeof(char)*12);//等价于 pArray[0] = (char *)malloc(sizeof(char)* 12);pArray[1] = (char *)malloc(sizeof(char)* 20);pArray[2] = (char *)malloc(sizeof(char)* 20);pArray[3] = (char *)malloc(sizeof(char)* 20);pArray[4] = (char *)malloc(sizeof(char)* 20);//错误的赋值方法//pArray[0] = "aaa";已经改变指针pArray[0]的指向了,赋值操作之后pArray[0]指向是一个全局区的字符串//全局区的字符串是个常量,不可以修改,不可以free/*pArray[0] = "aaa";pArray[1] = "bvbb";pArray[2] = "ssss";pArray[3] = "eee";pArray[4] = "atttaa";*/strcpy(pArray[0], "111");strcpy(pArray[1], "222");strcpy(pArray[2], "333");strcpy(pArray[3], "444");strcpy(pArray[4], "5asfa");//打印数组printfArr(pArray, &num);//释放内存freeMalloc(pArray, &num);if (pArray != NULL){free(pArray);pArray = NULL;}system("pause");
}

C语言 二级指针内存模型②相关推荐

  1. C语言二级指针内存模型建立

    C语言二级指针内存模型建立 代码 解析 代码 void main() {int i = 0;//指针数组char * p1[] = {"123", "456"

  2. C语言 二级指针内存模型混合实战

    http://www.cnblogs.com/zhanggaofeng/p/5485833.html //二级指针内存模型混合实战 #define _CRT_SECURE_NO_WARNINGS #i ...

  3. 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )

    文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...

  4. C语言 二级指针内存分配、初始化和释放

    二级指针的内存分配 使用malloc函数 使用calloc函数 C语言有两种内存分配函数,一个为malloc函数,一个为calloc函数.两者在使用上具有差不多的功能. 使用malloc函数 mall ...

  5. 【C 语言】二级指针 内存模型图 ( 指针数组 | 二维数组 | 自定义二级指针内存 )

    文章目录 前言 一.指针数组 二.二维数组 三.自定义二维指针内存 前言 绘制如下 333 种二级指针的内存模型 : // I. 指针数组 char *p1 []= {"12", ...

  6. c语言二级指针内存释放,详解C语言-二级指针三种内存模型

    二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别 第一种内存模型char *arr[] 若有如下定义 char *arr[] = {&quo ...

  7. c语言二级指针实现队列,C语言二级指针底层实现

    C语言中,Pointers to Pointers,即二级指针. 一级指针和二级指针的值都是指向一个内存单元: 一级指针指向的内存单元存放的是源变量的值, 二级指针指向的内存单元存放的是一级指针的地址 ...

  8. C语言字符串相关一级指针内存模型

    C语言字符串相关一级指针内存模型 通过实例探索一级指针内存模型 通过实例探索一级指针内存模型 void main() {char buf[20]= "aaaa";char buf2 ...

  9. 【C 语言】字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )

    文章目录 一.字符串 一级指针 内存模型 1.指定大小字符数组 2.未指定大小字符数组 3.指向常量字符串的指针 4.指向堆内存的指针 一.字符串 一级指针 内存模型 #include <std ...

  10. 关于C语言二级指针正确使用总结

    关于C语言二级指针正确使用总结 什么是二级指针 C语言中的二级指针其实就是指向指针的指针,指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链.同理可以构建三级或者N级指针,但是一般情况下用不到 ...

最新文章

  1. 爬虫之xpath语法-节点修饰语法
  2. 如何破解Red Hat Enterprise 4的root密码(救援有密码)
  3. Swift在Xcode 6.1 Beta 3中的更新
  4. 昵图网学校计算机教室制度,ClassIn在线教室
  5. 29_Java_数据库_第29天(JDBC、DBUtils)_讲义
  6. 【数学和算法】最小二乘法,SVD奇异值分解、LU分解的应用场景
  7. Java如何判断今天本月第几周的周几?
  8. cmd命令大全 DOS窗口命令
  9. Bit-Z推出去中心化多链钱包CoinU 打造资产价值生态体系
  10. oracle cpu 100%原因,oracle 12.1 cpu 100%
  11. 前端学习(534):多列布局1
  12. .NET下一种简单的调试诊断方法
  13. paip.输入法编程--词频调整原则--发音长度优先
  14. NYOJ a problem is easy
  15. ad如何计算电路板的pin数量_PCB厂一到八层电路板的叠层设计方式
  16. 6个VMware桌面虚拟化的替代方案
  17. r相机采集的图片转化为halcon识别的图像源码_直播系统开发:关于直播源码中美颜SDK的作用...
  18. SDK emulator directory is missing | Android Studio报错
  19. linux下免费远程控制工具,ToDesk Linux版下载
  20. ui设计现状与意义_UI设计的现状如何?

热门文章

  1. 交互设计原则有哪些?
  2. mysql常用监控脚本命令列表
  3. [转帖]ASP.NET4中不要相信Request.Browser.Cookies,Form验证要用UseCookies
  4. mybatis PageBounds应用分页
  5. js requestAnimationFrame
  6. 【转】HeadFirst 组合模式+迭代器错误原因以及解决代码
  7. Spring总结七:AOP动态代理的实现
  8. jquery学习之$(document).ready()
  9. Sublime Text 2 常用插件介绍
  10. wordpress and theme