C语言 二级指针内存模型②
//二级指针第二种内存模型 #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 ...
随机推荐
- 基础学习day12--多线程一线程之间的通信和常用方法
一.线程之间的通信 1.1.线程之间的通信方法 多个线程在处理统一资源,但是任务却不同,这时候就需要线程间通信. 等待/唤醒机制涉及的方法: 1. wait():让线程处于冻结状态,被wa ...
- Finder增强插件XtraFinder
关于在Mac上安装XtraFinder插件,现在因为Mac更新到10.11, Mac OS X 10.11(El Capitan)默认开启了 SIP(System Integrity Protecti ...
- jquery miniui , 普加甘特图,流程管理
http://www.miniui.com/docs/quickstart/index.html 普加 甘特图 流程管理 http://www.plusgantt.com/project/demo/P ...
- socket服务器开发中的SO_REUSEADDR选项与让人心烦的TIME_WAIT
1 发现问题 我在开发一个socket服务器程序并反复调试的时候,发现了一个让人无比心烦的情况:每次kill掉该服务器进程并重新启动的时候,都会出现bind错误:error:98,Address al ...
- python数据结构-基本数据类型
- 【nginx】负载均衡和proxy的配置
简介 使用upstream模块实现nginx负载均衡使用nginx_upstream_check_module模块实现后端服务器的健康检查使用nginx-sticky-module扩展模块实现Cook ...
- JSON实战案例--使用JSON进行数据交换实例
内容: 1.访问javaScript对象的属性 2.访问Javacript对象数组 3.JSON字符串转换成JavaScript对象 4 .Java对象转换成JSON字符串 5 .使用JSON完成级联 ...
- C语言杂谈(三)存储类别
本文讨论C语言中的存储类别,包括数据在内存的存储.变量的存储类别.函数的存储类别.生存周期.下图为计算机的存储空间,有寄存器和内存. 一.存储区域 1.寄存器:存放立即参加运算的数据. 2.系统区:存 ...
- Web Storage API : LocalStroage
这是一篇详细介绍详细介绍详细介绍_(:з」∠)_ 背景: 当你访问一个页面,并不是丢到服务器,等待用户访问就可以了的.从输入网址到显示网页的全过程,可以参考这里 简单来说,在输入url按下回车键后,首 ...
- Palindrome subsequence
Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65535 K (Java/ ...