//二级指针第二种内存模型 #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语言 二级指针内存模型②的更多相关文章
-
C语言 二级指针内存模型混合实战
//二级指针内存模型混合实战 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #i ...
-
C语言 二级指针内存模型③
//二级指针内存模型③ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #incl ...
-
C语言 二级指针内存模型①
//二级指针第一种内存模型 #include<stdio.h> #include<stdlib.h> //说明:①:类似于int a[5]={0},数组名a是一维数组a中首元素 ...
-
c语言二级指针内存模型
第一种: 指针数组作为输入参数 char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", " ...
-
深入理解C语言-二级指针三种内存模型
二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别 第一种内存模型char *arr[] 若有如下定义 char *arr[] = {&quo ...
-
真正明白C语言二级指针(转载)
指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也经常用到:比如说对于字符串的处理,函数参数的“值,结果传递”等,对于二级指针或者多级指针,我想理解起来也是比较容易的,比如二级指针就是指向指针的 ...
-
真正明白c语言二级指针
指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也经常用到:比如说对于字符串的处理,函数参数的“值,结果传递”等,对于二级指针或者多级指针,我想理解起来也是比较容易的,比如二级指针就是指向指针的 ...
-
C语言二级指针底层实现
C语言中,Pointers to Pointers,即二级指针. 一级指针和二级指针的值都是指向一个内存单元: 一级指针指向的内存单元存放的是源变量的值, 二级指针指向的内存单元存放的是一级指针的地址 ...
-
C语言二级指针(指向指针的指针)
转载:http://c.biancheng.net/cpp/html/85.html 指针可以指向一份普通类型的数据,例如 int.double.char 等,也可以指向一份指针类型的数据,例如 in ...
随机推荐
-
git rebase 和 reset的区别
check the command detail by input 'git command --help' rebase: reset:
-
ecshop JSON,ajax.call 异步传输
1.res = Ajax.call('user.php?act=depot_id', 'id='+v,null,"GET", "JSON",false); 2. ...
-
使用ExceptionHandlingScope进行高效的SharePoint CSOM编程
异常处理 在我们使用SharePoint API的时候,获取某些对象的时候,可能会出异常,那么CSOM如何处理这种情况呢. 我们在获取某个List的时候,代码如下: using (ClientCont ...
-
根据第三方提供的wsdl报文(axis2开发),进行的webservice应用的开发实例
接口应用名称:NgCallService 入参和出参信息 入参和出参报文信息 入参: <?xml version="1.0" encoding="UTF-8&quo ...
-
Python学习(5)——内置函数
常用字符串内置函数 1)str.count() //返回该字符串中某个子串出现的次数 2)str.find() //返回某个子串出现在该字符串的起始位置 3)str.lower() //将该字符串全部 ...
-
Apache Rewrite 中文详解
这几天一直在研究Apache的重写规则,虽然网上有很多教程,不过发现大部分都是抄袭一个人的,一点都不全,所以我想写一个简单的易于理解的教程,我学习.htaccess是从目录保护开始的,这个也比较简单, ...
-
async/await,了解一下?
上一篇博客我们在现实使用和面试角度讲解了Promise(原文可参考<面向面试题和实际使用谈promise>),但是Promise 的方式虽然解决了 callback hell,但是这种方式 ...
-
三、Template 模板模式
需求:有规格的尺子,不管何种笔写,写出的字大小.形状都是一样的?抽象为处理流程一致,仅仅是不同的实现 代码清单: 抽象类: public abstract class AbstractDisplay{ ...
-
MySQL系统时间函数NOW(),CURRENT_TIMESTAMP(),SYSDATE()的区别
CURRENT_TIMESTAMP是NOW的同义词,也就是说两者是相同的. SYSDATE函数返回的是执行到当前函数时的时间,而NOW返回的是执行SQL语句时的时间. 测试语句: SELECT NOW ...
-
ASP.NET MVC Controller 编程所涉及到的常用属性成员
Controller (System.Web.Mvc.Controller) 1.获取路由中的各个值 Request.RequestContext.RouteData.Values["id& ...