您的位置:首页 > 编程语言 > C语言/C++

C语言 二级指针内存模型②

2016-04-08 16:10 435 查看
//二级指针第二种内存模型

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//打印数组
int printfArr(char **pin,int *num){
int ERRO_MSG = 0;
if (pin==NULL)
{
ERRO_MSG = 1;
printf("pin==NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
if (num == NULL)
{
ERRO_MSG = 2;
printf("num == NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
int i = 0;
for (i = 0; i < *num; i++)
{
printf("%s\n", pin[i]);
}
return ERRO_MSG;
}

//释放内存
int freeMalloc(char **pin, int *num){
int ERRO_MSG = 0, i = 0;
if (pin == NULL)
{
ERRO_MSG = 1;
printf("pin==NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
if (num == NULL)
{
ERRO_MSG = 2;
printf("num == NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
for (i = 1; 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 = 5;
char ** pArray = (char **)malloc(num*sizeof(char *));
memset(pArray, 0, 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 + 0) = (char *)malloc(sizeof(char)*12);
//等价于 pArray[0] = (char *)malloc(sizeof(char)* 12);
pArray[1] = (char *)malloc(sizeof(char)* 20);
pArray[2] = (char *)malloc(sizeof(char)* 20);
pArray[3] = (char *)malloc(sizeof(char)* 20);
pArray[4] = (char *)malloc(sizeof(char)* 20);
//错误的赋值方法
//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[0], "111");
strcpy(pArray[1], "222");
strcpy(pArray[2], "333");
strcpy(pArray[3], "444");
strcpy(pArray[4], "5asfa");
//打印数组
printfArr(pArray, &num);
//释放内存
freeMalloc(pArray, &num);
if (pArray != NULL)
{
free(pArray);
pArray = NULL;
}
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: