zoukankan      html  css  js  c++  java
  • 二级指针的三种内存模型 分类: C语言学习 2015-03-30 21:04 153人阅读 评论(0) 收藏

    /*
    Level tow point have three cache model
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    int Print(char**pArr);
    int Print02(char**pArr,int num);
    int GetMem(char***thirdModel,int len);
    int Destory(char***thirdModel,int len);
    int main()
    {
    
    	int i=0;
    	char **thirdModel=NULL;
    	//first cache model
    	char *firstModel[10]={"abc","linux","unix",0};
    	//second cache model
    	char secondModel[3][10]={"abc","linux","unix"};
    	//third cache model
    	GetMem(&thirdModel,4);
    	strcpy(*(thirdModel+0),"abc");		
    	strcpy(*(thirdModel+1),"linux");		
    	strcpy(*(thirdModel+2),"unix");		
    
    	printf("firstModel start
    ");
    	Print(firstModel);
    	printf("secondModel start 
    ");
    	Print02(secondModel,4);
    	printf("thirdModel start
    ");
    	Print(thirdModel);
    	Destory(&thirdModel,4);
    	return 0;		
    }
    int Print(char**pArr)
    {
    	int ret=0,i=0;
    	if(NULL==pArr)
    	{
    		ret=-1;
    		printf("arg is null error:%d
    ",ret);
    		return ret;
    	}
    	while(*pArr)
    	{
    		printf("%s
    ",*pArr);	
    		++pArr;
    	}
    	return ret;
    }
    
    
    int Print02(char**pArr,int num)
    {
    	int ret=0,i=0;
    	//二级指针和指向数组的指针不一样。
    	char(*arr)[10]=pArr;
    	if(NULL==pArr)
    	{
    		ret=-1;
    		printf("arg is null error:%d
    ",ret);
    		return ret;
    	}
    	for(i=0;i<num;i++)
    	{
    		printf("%s
    ",*(arr+i));
    	}
    	return ret;
    }
    
    //三级指针做输出模型
    int GetMem(char***thirdModel/*out*/,int len)
    {
    	int ret=0,i=0;
    	if(NULL==thirdModel || len<=0)
    	{
    		ret=-1;
    		return ret;
    	}
    
    	char**tmp=(char**)malloc(len*sizeof(char*));
    	if(NULL==tmp)
    	{
    		ret=-1;
    		return ret;
    	}
    	for(i=0;i<len-1;i++)
    	{
    		*(tmp+i)=(char*)malloc(100*sizeof(char));		
    		if(NULL==*(tmp+i))
    		{
    			ret=-1;
    			return ret;
    		}
    	}
    	*(tmp+(len-1))=0;
    	*thirdModel=tmp;
    	return ret;
    }
    //销毁堆上的内存
    int Destory(char***thirdModel,int len)
    {
    	int ret=0,i=0;
    	char **tmp=NULL;
    	if(NULL==thirdModel || len<=0)
    	{
    		ret=-1;
    		return ret;
    	}
    	tmp=*thirdModel;
    	for(i=0;i<len;i++)
    	{
    		if(NULL!=*(tmp+i))		
    		{
    			free(*(tmp+i));
    			*(tmp+i)=NULL;
    		}
    	}
    	free(tmp);
    	*thirdModel=NULL;
    	return ret;
    }
    
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    小素典会员订阅协议
    vue项目自动构建工具1.0,支持多页面构建
    spring boot 框架根據 sql 創建語句自動生成 MVC層類代碼
    使用 docsify 創建自己的 markdown 文檔系統
    “衣”及其部分屬字
    js原型鏈與js繼承解析
    js 中怎么获取session 值和HTML标签的属性值
    layui table动态表头 改变表格头部 重新加载表格的方法
    throw throws Throwable 关联于区别
    静态代理和动态代理的区别和联系
  • 原文地址:https://www.cnblogs.com/L-Lune/p/4671283.html
Copyright © 2011-2022 走看看