二级指针的申请和释放问题

标签:
it |
分类: 读书~笔记 |
在c++中,二级指针的申请和释放如下:
#include
<stdio.h>
#include
<string.h>
#define ROW
3
#define LIE
10
int
main()
{
char
**strArray = NULL;
int
i=0,j=0;
//申请内存
for(j = 0;
j<ROW; j++)
{
strArray[j]
= new char[LIE];//其实列可以不固定大小的!
//strArray[j]
="123";//strArray[j]相当于j行的行指针
}
//释放内存
for(i = 0; i
< ROW; i++)
{
delete[]
strArray[i];
strArray[i]
= NULL;
}
delete[]
strArray;
strArray =
NULL;
}
上边的程序在c++环境中运行是对的,但如果不注释那条红色的字,则报错:![二级指针的申请和释放问题 二级指针的申请和释放问题]()
![二级指针的申请和释放问题 二级指针的申请和释放问题]()
http://s7/middle/642e41c2gbbfeca459c96&690
刚开始很纳闷,在网上查找,发现二级指针就是这么使用的啊,后来问一个做c++开发的学长,经过他的分析,终于了解了!"123" 是一个 const char *,当执行 strArray[j]
="123"时改变了strArray[i]指针变量的值【地址】,并不是 new
出的那个指针了 ,即strArray[j] != new char[LIE]
了,现在是 strArray[j] = const char *,所以在最后delete指针的时候非法。如果要改变指针的指向,则可以使用:
刚开始很纳闷,在网上查找,发现二级指针就是这么使用的啊,后来问一个做c++开发的学长,经过他的分析,终于了解了!"123" 是一个 const char *
strncpy(strArray[j], "123",
strlen("123")+1);或者memcpy(strArray[j],
"123", strlen("123")+1);
这样的话改变的是strArray[j]指针指向内存的内容【是内容】,所以delete的时候释放的还是申请的内存空间地址。
【以上是自己个人的理解,不知道对不对,望知道的指正@!】
在c语言中是用malloc和delete申请和分配内存的:
#include
<stdio.h>
#include
<malloc.h>
#include
<string.h>
#define ROW
3
#define LIE
10
int
main()
{
char
**strArray=NULL;
int
i=0,j=0;
strArray=(char
**)malloc(sizeof(char *) * ROW);//分配指针数组
for(i=0;
i<ROW; i++)
{
strArray[i]=(char
*)malloc(sizeof(char) * LIE);//分配每个指针所指向的数组
}
//释放
for(i = 0; i
< ROW; i++)
{
free(strArray[j]);
strArray[i]
= NULL;
}
free(strArray);
strArray =
NULL;
return
0;
}
一篇不错的博文《二维数组的动态分配及参数传递》:http://www.cnblogs.com/bigshow/archive/2009/01/03/1367661.html
前一篇:函数间动态内存的传递
后一篇:入职培训十天总结