动态创建的二维数组问题

chowming 2008-03-15 07:04:56

#include <iostream>

using namespace std;
#define N 10
#define M 10
int main()
{
int **p;
p = new int*[M];
for(int i = 0;i<M;i++)
p[i] = new int[N];

for(int l = 0;l<M;l++)
for(int k = 0;k<N;k++)
{
p[l][k] = rand()%200;
//cout<<p[l][k]<<ends;
}
//cout<<endl;
for(i = 0;i<N*M;i++)
cout<<p[0][i]<<ends;
for(i = 0;i<M;i++)
delete []p[i];
delete []p;
return 0;
}


与下面代码的区别

#include <iostream>

using namespace std;
int main()
{
int p[10][10];
for(int i = 0;i<10;i++)
for(int j = 0;j<10;j++)
p[i][j] = rand()%100;
for(i = 0;i<100;i++)
cout<<p[0][i]<<ends;
return 0;
}



第一个输出的结果有很多错误的数字
问一下动态分配二维数组的存储空间难道不是连续的吗?
...全文
163 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengzhe 2008-03-16
  • 打赏
  • 举报
回复
楼上的有道理!! 灰常正确
arong1234 2008-03-15
  • 打赏
  • 举报
回复
第一个是动态分配的其实不是二维数组,是一个二维指针指向一堆一维指针,然后一维指针又指向一堆数组,各个数组的地址空间是不连续的,你用1维的方法去访问它,将破坏系统内存,导致内存访问越界

第二个才是真正的二维数组,其在内存布局上其实和一维数组完全一样。因此你可以用p[0][i]的方式用一维数组访问二维数组


你可以看看 http://blog.vckbase.com/arong/archive/2004/06/05/371.html
PS:二维数组实际是无法动态创建的,通过各种方法伪造出的二维数组其实不是二维数组

guanlei000 2008-03-15
  • 打赏
  • 举报
回复
输出结果如下:
41 67 134 100 169 124 78 158 162 64
105 145 81 27 161 91 195 142 27 36
191 4 102 153 92 182 21 116 118 95
47 126 171 138 69 112 67 99 35 94
103 11 122 133 73 64 141 111 53 68
147 44 62 157 37 59 123 141 129 178
116 35 190 42 88 106 40 142 64 48
46 5 90 129 170 150 6 101 193 148
29 23 84 154 156 40 166 176 131 108
144 39 26 123 137 138 118 82 129 141
Press any key to continue
guanlei000 2008-03-15
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
#define N 10
#define M 10
int main()
{
int **p;
p = new int*[M];
for(int i = 0;i<M;i++)
p[i] = new int[N];

for(int l = 0;l<M;l++)
{
for(int k = 0;k<N;k++)
{
p[l][k] = rand()%200;
}
}

for(l = 0;l<M;l++)
{
for(int k = 0;k<N;k++)
{
cout<<p[l][k]<<" ";
}
cout<<endl;
}
for(i = 0;i<M;i++)
delete []p[i];
delete []p;
return 0;
}

输出方法不对,所以导致有很多错误数字的出现,像我这样输出就可以了;
第一种方法是动态分配内存,是在堆里分配,不连续;
第二种方法是在栈中分配内存;
lockhall 2008-03-15
  • 打赏
  • 举报
回复
for(i = 0;i<10;i++)
for(int j = 0;j<10;j++)
cout<<p[i][j]<<endl;
ttkk_2007 2008-03-15
  • 打赏
  • 举报
回复

for(i = 0;i<N*M;i++)
cout<<p[0][i]<<ends; //这个用法就不对,都越界了

ttkk_2007 2008-03-15
  • 打赏
  • 举报
回复
第一个是动态分配到堆内存的,第二个是在栈内存
动态分配的二维数组一般是不连续的

64,650

社区成员

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

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