C语言的二维数组空间分配

Singereric 2004-09-17 11:24:43
还是那本数据结构的书。介绍动态二维数组的空间分配。

r行,c列的二维数组a。分配方法一是
int* a = malloc(r * c * sizeof(int));
那本书不推荐这种方法,因为并非每种C的编译器都按照行优先的规则来访问二维数组。
也就是说a[m][n]未必等于a[m * c + n];

书上推荐方法二,做了这么个函数
int **malloc2d(int r, int c)
{
int i;
int **t = malloc(r * sizeof(int *));
for (i = 0; i < r; i++)
t[i] = malloc(c * sizeof(int));
return t;
}
但这样就能保证a[m][n]等于a[m * c + n]了吗,在这个函数中malloc是分次分配每行的空间的,能否保证各行在内存中是紧挨着的呢?
...全文
397 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
crtd024 2004-09-20
  • 打赏
  • 举报
回复
对了,忘记说了,上面的语句全是修改数组中第二行,第三列元素。还有你说(**&x)是什么意思, char **y;
Make2DArray(y,3,3);
bool Make2DArray(char **&x,int rows,int cols)
这里x为形参,y为实参,&是C++中的引用,这里你可以简单理解成x就是y了,他们一摸一样,只是名字不同而已。
你找本C++的语法书看看,就明白了。
good luck !
crtd024 2004-09-20
  • 打赏
  • 举报
回复
对二维数组进行寻址方法介绍:
int Array[3][3];
Array[0][0]=11; Array[0][1]=12; Array[0][2]=13;
Array[1][0]=21; Array[1][1]=22; Array[1][2]=23;
Array[2][0]=31; Array[2][1]=32; Array[2][2]=33;

//----------方法1----------------------------------------
int (*p)[3][3]; //这个P指向整个二维数组,所以(p+1)这样语句非法
p=&Array;
*(*(*p+1)+2)=54;//等价于 (*p)[1][2]=54;

//----------方法2----------------------------------------
int (*p)[3]; //这个p指向二维数组的每一个行,每一行你可以看成一个单位
p=&Array[0];
*(*(p+1)+2)=54;//等价于 *(p[1]+2)=54;

//----------方法3---------------------------------
int *p;
p=&Array[0][0]; //这个p实际上指向二维数组的每一个元素
*(p+5)=54;
crtd024 2004-09-19
  • 打赏
  • 举报
回复
这几天比较忙,之后给你发个详细的文件你就明白了,呵呵。
Singereric 2004-09-18
  • 打赏
  • 举报
回复
其实楼主不必担心内存是否紧挨着,内存的物理实现由编译器和操作系统负责,作为程序员,你只需要把注意力放在程序的逻辑实现上。真的不用担心,^-^
********************************************************************
我并不关心底层的事情,我觉得这个问题是和后面二维数组的使用有关系的。比如说类似于p = a + 7在数组中到底在什么位置
Singereric 2004-09-18
  • 打赏
  • 举报
回复
感谢crtd024(37度半)
**&x这样的传递参数我第一次看到,是什么含义呢
还有我仍然很想直到在C语言里面对a[m][n]这样的表达式到底是怎样进行寻址的
crtd024 2004-09-18
  • 打赏
  • 举报
回复
我给你写了个动态二位数组分配代码,希望能给你提供帮助:)
//分配函数
bool Make2DArray(T **&x,int rows,int cols)
{
x=new T*[rows];//创建行指针
//为每一行分配空间
for(int i=0;i<rows;i++)
x[i]=new T[cols];
return true;
}

//释放函数
bool Delete2DArray(T **&x,int rows)
{
//释放每次分配的空间
for(int i=0;i<rows;i++)
delete[] x[i];
//删除行指针
delete[] x;
//指针赋空值
x=0;
}

使用的时候:例如:T为char
char **y;
Make2DArray(y,3,3);
y[0][1]='a'; //这样就可以赋值了,
y[1][1]='d';
我认为最好用new,delete,有什么问题可以进一步讨论。

oo 2004-09-17
  • 打赏
  • 举报
回复
为什么要保证保证a[m][n]等于a[m * c + n]?
只要每次用a[m][n]能取到正确的值就行了。

int* a = malloc(r * c * sizeof(int));
这样出来的能用a[m][n]吗?呵呵...
如果m,n是事先确定的,这样或许可以:
typedef int INT_ARRAY2[m][n];
INT_ARRAY2 a = (INT_ARRAY2)malloc(m*n*sizeof(int));
.....
a[i][j] = 123;

后一种方法,不是所有的元素在内存中都是紧挨着的,而是分成r块。

grooving 2004-09-17
  • 打赏
  • 举报
回复
在自由存储区上存储的数据不能保证。
如果声明是:
int a[m][n];
可以。
zgy166 2004-09-17
  • 打赏
  • 举报
回复
能保证
heroboy2000 2004-09-17
  • 打赏
  • 举报
回复
int (*p)[20]=new int[10][20];
jxhwei 2004-09-17
  • 打赏
  • 举报
回复
其实楼主不必担心内存是否紧挨着,内存的物理实现由编译器和操作系统负责,作为程序员,你只需要把注意力放在程序的逻辑实现上。真的不用担心,^-^
fanbest 2004-09-17
  • 打赏
  • 举报
回复
笔误

*str=new int[size1];
改为
str[i]=new int[size1];
fanbest 2004-09-17
  • 打赏
  • 举报
回复
to 楼上

int **str;
str=new int*[size];
for(int i=0;i<size;i++)
*str=new int[size1];
alwaysfreeboy 2004-09-17
  • 打赏
  • 举报
回复
c++中怎么申请动态二维数组?
Singereric 2004-09-17
  • 打赏
  • 举报
回复
为什么要保证保证a[m][n]等于a[m * c + n]?
只要每次用a[m][n]能取到正确的值就行了。
*************************************************************
在C语言中,到底是怎样对a[m][n]进行寻址的呢
是按a[m*c +n]化成一维数组
还是先在找到指针a[m][],再通过这个指针指向到一维数组?

64,646

社区成员

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

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