C语言 二级指针内存模型混合实战
//二级指针内存模型混合实战
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //将内存模型①和内存模型②的数据拷贝到内存模型③
char ** threemodel(char **pin1,int num1,char (*pin2)[],int num2,char **pin3,int *pnum3){
if (pin1==NULL)
{
printf("pin1==NULL\n");
}
if (pin2 == NULL)
{
printf("pin2==NULL\n");
}
if (num1 == )
{
printf("num1 == 0\n");
}
if (num2 == )
{
printf("num2 == 0\n");
}
int num3 = num1 + num2;
int i = , j = ,index=;
//分配二级指针内存堆空间
pin3 = (char **)malloc(sizeof(char *)*num3);
if (pin3==NULL)
{
printf("分配二级内存失败!");
return NULL;
}
for (i = ; i < num1; i++)
{
//获取本段字符串的长度
int temp1 = (int)strlen(pin1[i]) + ;//strlen()函数获取的是字符串(不包括'\0')的长度,因此长度需要+1
//分配一级指针内存堆空间
pin3[index] = (char *)malloc(sizeof(char)* temp1);
if (pin3[index] == NULL)
{
printf("分配一级内存失败!");
return NULL;
}
//开始拷贝数据
strcpy(pin3[index], pin1[i]);
index++;
}
for (j = ; j < num2; j++)
{
int temp1 = (int)strlen(*(pin2 + j)) + ;
//*(pin2 + j)==pin2[j],但是*(pin2 + j)便于理解
//分配一级指针内存堆空间
pin3[index] = (char *)malloc(sizeof(char)* temp1);
if (pin3[index] == NULL)
{
printf("分配一级内存失败!");
return NULL;
}
//开始拷贝数据
strcpy(pin3[index], *(pin2 + j));
index++;
}
*pnum3 = num3;
return pin3;
} void main()
{
//第一种内存模型
char *pstr[] = {"","",""};
//第二种内存模型
char tarr[][] = {"aaa","bbb","ccc"};
//第三种内存模型
char **pdata = NULL;
int num = ,i=;
pdata = threemodel(pstr, , tarr, , pdata, &num);
if (pdata!=NULL)
{
for (i = ; i < num; i++)
{
if (pdata[i]!=NULL)
{
printf("%s\n", pdata[i]);
//释放当前内存
free(pdata[i]);
//消除野指针
pdata[i] = NULL;
}
}
//释放pdata所指向的内存空间
free(pdata);
pdata = NULL;
}
system("pause");
}

C语言 二级指针内存模型混合实战的更多相关文章
- 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语言 二级指针内存模型②
//二级指针第二种内存模型 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #incl ...
- 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 ...
随机推荐
- [转]一些NSArray,NSDictionary,NSSet相关的算法知识
iOS编程当中的几个集合类:NSArray,NSDictionary,NSSet以及对应的Mutable版本,应该所有人都用过.只是简单使用的话,相信没人会用错,但要做到高效(时间复杂度)精确(业务准 ...
- HTML5 -1- 简介
在介绍HTML5之前我们应该先了解一下HTML5 我想从下面开始简单了解一下HTML5 什么是HTML5??? HTML5 即HTML 5.0 版本 正式制定时间是在2014年 遵循着移动先行(前四个 ...
- 【原】训练自己haar-like特征分类器并识别物体(2)
在上一篇文章中,我介绍了<训练自己的haar-like特征分类器并识别物体>的前两个步骤: 1.准备训练样本图片,包括正例及反例样本 2.生成样本描述文件 3.训练样本 4.目标识别 == ...
- Gradle安装
最近在学Android,而Android是由Gradle来构建的:Gradle是一个基于 JVM 的构建工具.所以开始学习Android之前,先进行Gradle安装与学习: mac: 使用SDKMAN ...
- iOS中倒计时
方法一:使用NSTimer来实现(比较适用于发送短信验证码倒计时) 主要是利用NSTimer的scheduledTimerWithTimeInterval方法来每秒执行一次changeTime方法 / ...
- [Jmeter]打开jmeter.bat报错的解决思路与方法
解决过程: 打开apache-jmeter-3.0的jmeter.bat时,报错如下: 查看报错信息,应该是属于环境变量配置问题. 因此加上jave_home的路径语句在jmeter.bat文件上: ...
- Effective Java 14 In public classes, use accessor methods, not public fields
Principle To offer the benefits of encapsulation you should always expose private field with public ...
- Effective Java 74 Implement Serializable judiciously
Disadvantage of Serializable A major cost of implementing Serializable is that it decreases the flex ...
- PS网页设计教程XXX——在PS中创建一个漫画书主题网页布局
作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,“熟读唐诗三百首,不会作诗也会吟”. 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试 ...
- Servlet生命周期+工作原理
Servlet生命周期+工作原理 1.Servlet的生命周期: Servlet加载,加载,服务,销毁. 2.典型函数解释: Init():这个函数是用来初始化Servlet对象的.在 ...