加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2012-03-24 22:58:58)
标签:

it

分类: 读书~笔记
在c++中,二级指针的申请和释放如下:
#include <stdio.h>
#include <string.h>

#define ROW 3
#define LIE 10

int main()
{
char **strArray = NULL;
int i=0,j=0;
//申请内存
    strArray = new char*[ROW];// 注意此处的*不是乘号!而是char *类型
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;
    return 0;
}
上边的程序在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指针的时候非法。如果要改变指针的指向,则可以使用:
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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有