二维指针数据的动态分配问题

Jamy325 2009-04-17 06:10:00


...
int** m;
m=new int* [n*n]//n在前面定义过的一个常量
for (int i=0;i<n;i++) m[i][i]=0;
..

这行代码编译的时候没有问题,但是运行的时候,
到for循环就不出现错误1``
出现的错误是:0x0003447f 处未处理的异常: 0xC0000005: 写入位置 0xcdcdcdcd 时发生访问冲突.
忘高人给予解答``怎么改正``
...全文
709 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jamy325 2009-04-17
  • 打赏
  • 举报
回复
呵呵``问题解决了``结贴``谢谢各位了``
sherrik 2009-04-17
  • 打赏
  • 举报
回复
别人那摘抄来的 LZ可以参考下。

二维数组的动态分配和删除

首先,动态支持数组的分配,必须用 new 来进行创建一段堆内存,其它的存贮区域不允许动态分配的产生。
其次,C++并没有提供真正的动态多维数组语法,想动态分配数组,必须通过一维动态数组组合形成一个类似多维数组的存贮形式,并不像静态分配多维数组,它们的用法虽说有些地方 有相似之处,但不完全相同。
再次,有些网友有一些很BT的分配方式。

例如:
int (*p)[4] = new int[3][4];
解释:可能有些初学者认为这样是可取的,也是利用 new 分配的数组,就可以是动态的,那你的想法就错了,它的分配必须得有最外层 const的支持—
int x = 3, y = 4;
int (*p)[y] = new int[x][y];//error,y必须是const。

所以这种方式不能达到真正的动态分配二维数组的目的,只能相当于半自动化的一个分配方式。
那么如果依靠下面的这种方式是正确的:

例:
int x = 3, y = 4;
int *p = new int*[x];//创建一个动态 int* 型数组
for(int i = 0; i < y; ++i)
p = new int[x]; //再创建一个动态 int 型数组

for (int i = 0; i < y; ++i)
{
 delete p;//由里至外,进行释放内存。
 p = NULL;//不要忘记,释放空间后p不会自动指向NULL值,还将守在原处,只是释放内存而已,仅此而已。
}
delete []p;
p = NULL;

它就是依靠一维数组的组合来完成,这样创建的动态数组就是一个全自动的个分配方式。

void * buf = malloc(x * y * sizeof (int) ); //这也是一个好方法,简单方便,但它是C里面的分配方式。
free(buf);//释放内存简单方便.
cyldf 2009-04-17
  • 打赏
  • 举报
回复

...
int** m;
m=new int* [n*n]//n在前面定义过的一个常量只是一个申请了n*n个空间的一维数组,里面是int *指针,所以在后面赋值的时候由于m[i][i]没有申请空间而异常中断
for (int i=0;i<n;i++) m[i][i]=0;
..


liliangbao 2009-04-17
  • 打赏
  • 举报
回复
因为你分配了一级内存,即指针,但是二级没有分配,即指针的指向,所以你的使用是非法访问~
修改:
int** m;
m=new int* [n]
for( int i = 0; i < n; i++ )
m[i] = new int[n];
zhh157 2009-04-17
  • 打赏
  • 举报
回复
因为你只分配了一级内存

...
int** m;
m=new int* [n]
for( int i = 0; i < n; i++ )
m[i] = new int[n];

for (int i=0;i<n;i++) m[i][i]=0;
..

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧