//二级指针第二种内存模型

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h> //打印数组
int printfArr(char **pin,int *num){
int ERRO_MSG = ;
if (pin==NULL)
{
ERRO_MSG = ;
printf("pin==NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
if (num == NULL)
{
ERRO_MSG = ;
printf("num == NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
int i = ;
for (i = ; i < *num; i++)
{
printf("%s\n", pin[i]);
}
return ERRO_MSG;
} //释放内存
int freeMalloc(char **pin, int *num){
int ERRO_MSG = , i = ;
if (pin == NULL)
{
ERRO_MSG = ;
printf("pin==NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
if (num == NULL)
{
ERRO_MSG = ;
printf("num == NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
for (i = ; 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 = ;
char ** pArray = (char **)malloc(num*sizeof(char *));
memset(pArray, , 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 + ) = (char *)malloc(sizeof(char)*);
//等价于 pArray[0] = (char *)malloc(sizeof(char)* 12);
pArray[] = (char *)malloc(sizeof(char)* );
pArray[] = (char *)malloc(sizeof(char)* );
pArray[] = (char *)malloc(sizeof(char)* );
pArray[] = (char *)malloc(sizeof(char)* );
//错误的赋值方法
//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[], "");
strcpy(pArray[], "");
strcpy(pArray[], "");
strcpy(pArray[], "");
strcpy(pArray[], "5asfa");
//打印数组
printfArr(pArray, &num);
//释放内存
freeMalloc(pArray, &num);
if (pArray != NULL)
{
free(pArray);
pArray = NULL;
}
system("pause");
}

C语言 二级指针内存模型②的更多相关文章

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

    //二级指针内存模型混合实战 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #i ...

  2. C语言 二级指针内存模型③

    //二级指针内存模型③ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #incl ...

  3. C语言 二级指针内存模型①

    //二级指针第一种内存模型 #include<stdio.h> #include<stdlib.h> //说明:①:类似于int a[5]={0},数组名a是一维数组a中首元素 ...

  4. c语言二级指针内存模型

    第一种: 指针数组作为输入参数 char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", " ...

  5. 深入理解C语言-二级指针三种内存模型

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

  6. 真正明白C语言二级指针(转载)

    指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也经常用到:比如说对于字符串的处理,函数参数的“值,结果传递”等,对于二级指针或者多级指针,我想理解起来也是比较容易的,比如二级指针就是指向指针的 ...

  7. 真正明白c语言二级指针

    指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也经常用到:比如说对于字符串的处理,函数参数的“值,结果传递”等,对于二级指针或者多级指针,我想理解起来也是比较容易的,比如二级指针就是指向指针的 ...

  8. C语言二级指针底层实现

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

  9. C语言二级指针(指向指针的指针)

    转载:http://c.biancheng.net/cpp/html/85.html 指针可以指向一份普通类型的数据,例如 int.double.char 等,也可以指向一份指针类型的数据,例如 in ...

随机推荐

  1. Python基础(1)--Python编程习惯与特点

    1.代码风格 在Python中,每行程序以换行符代表结束,如果一行程序太长的话,可以用“\”符号扩展到下一行.在python中以三引号(""")括起来的字符串,列表,元组 ...

  2. OC中结构体作为对象属性

    在OC中结构体有时候也作为对象的属性 类的定义 #import <Foundation/Foundation.h> typedef struct{ int year; int month; ...

  3. iOS网络-06-监听Iphone的网络状态

    使用系统的方法来监听网络状态 系统的方法是通过通知机制来实现网络状态的监听 实现网络状态监听的步骤 定义Reachability类型的成员变量来保存网络的状态 @property (nonatomic ...

  4. Apache Shiro 简介

    使用 Apache Shiro 为 web 应用程序进行用户身份验证 Shiro 是一个 Apache Incubator 项目,旨在简化身份验证和授权.在本文中,了解 Apache Shiro 并通 ...

  5. iOS 应用架构浅谈

    当我们讨论客户端应用架构的时候,我们在讨论什么? 其实市面上大部分应用不外乎就是颠过来倒过去地做以下这些事情: 简单来说就是调API,展示页面,然后跳转到别的地方再调API,再展示页面. App确实就 ...

  6. MongoDb的bin目录下文件mongod,mongo,mongostat命令的说明及使用

    MongoDB的下载地址:http://www.mongodb.org/downloads. 下载好直接解压安装包,即可使用. bin目录下的几个文件说明: mongo 客户端程序,连接MongoDB ...

  7. Html5如何使我们开发出来的应用或页面大小能适合各种高端手机使用

    本文简介:1.手机移动端页面的自适应2.手机触摸手动滑动效果 一.header信息的设置(自适应) 1.声明信息 <!DOCTYPE HTML> 2.编码设置 <meta chars ...

  8. 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解(转)

    Web Essentials是目前为止见过的最好用的VS扩展工具了,具体功能请待我一一道来. 首先,从Extension Manager里安装:最新版本是19号发布的2.5版 然后重启你的VS开发环境 ...

  9. MongoDB 存储引擎Wiredtiger原理剖析

    今天开始看MongoDB 3.2的文档,发现了这么两句话 Support for Multiple Storage Engines MongoDB supports multiple storage ...

  10. 设计模式C#实现(六)——单例模式

    单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 构成: 1.私有的构造函数 2.私有静态的实例 3.返回实例的静态方法 public class Singleton { privat ...