请教C语言中动态二维数组如何定义?

idea_yuye 2009-05-31 02:54:06
请教C语言中动态二维数组如何定义?
比如int *a,n;
a=(int *)malloc(n*sizeof(int));
free a;
这是定义一维数组,那如何定义二维数组?
...全文
4513 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
jtshining 2010-01-17
  • 打赏
  • 举报
回复
很棒啊太好了
pengpeng803 2009-10-10
  • 打赏
  • 举报
回复

int **p;
int i;

//申请空间
p = (int**)malloc(sizeof(int*)*M);
for (i=0; i<M; i++)
p[i] = (int*)malloc(sizeof(int)*N);

//释放空间
for (i=0; i<M; i++)
free(p[i]);
free(p);

我二楼的方法做了一个二维数组,发现只有第一个下标越界(超过M)时会出现断错误,但是第二的下标越界(超过N)确没有错误提示,为什么?
idea_yuye 2009-05-31
  • 打赏
  • 举报
回复
真是不可忽略的“*”啊,我错了
谢谢 大侠 指点啊
arong1234 2009-05-31
  • 打赏
  • 举报
回复
这是一个很严重的错误习惯,尽管sizeof(int)和sizeof(int*)是相等的,你还是应该用sizeof(int*),而不是sizeof(int)
原因在于两个:1。你的程序你的代码不仅仅要在运行上正确,在逻辑上也必须正确,这样无论别人去理解你代码还是你自己以后重读,都会有好处
2. 虽然现在sizeof(int)和sizeof(int*)是相等,但是不总是这样,例如iRmx上sizeof(int*)是6,64位系统上sizeof(int)可能是8,你偷懒、不关注一个*,将极大的降低你程序的可移植性
[Quote=引用 14 楼 ideayuye 的回复:]
突然发现 "(int*)"里的"*"有无无所谓!
int*和int的字节数都是4
[/Quote]
idea_yuye 2009-05-31
  • 打赏
  • 举报
回复
突然发现 "(int*)"里的"*"有无无所谓!
int*和int的字节数都是4
arong1234 2009-05-31
  • 打赏
  • 举报
回复
calloc是在栈上分配内存的函数吧?现在已经很少有人用了,它和malloc在这个二维数组问题上似乎没什么不同,不明白上面为什么说calloc比较形象
[Quote=引用 7 楼 ideayuye 的回复:]
"calloc"是什么东西啊? ~~~~没见过~~~~~~
[/Quote]
lingyin55 2009-05-31
  • 打赏
  • 举报
回复
嗯,保证空间连续就可以这样。
但是那种方法通用。

[Quote=引用 9 楼 goodname 的回复:]
好像给的例子还不完全是楼主的意思。

如果你需要
int arr[m][n];
的话,这样不行。

你可以使用
int *p;
p = (int *)malloc(m*n*sizeof(int));
直接申请就行了。
[/Quote]
arong1234 2009-05-31
  • 打赏
  • 举报
回复
个人认为上述方法虽然伪造出一个二维数组出来(只是访问形式是[][]的,实际还是不是二维数组),其维护成本高,产生的好处却不明显,不是很建议使用。一般应该尽量避免使用语言不支持的特性,常见的替换2维数组的方法有
1。 使用一个大尺寸的数组代替动态二维数组。例如二维数组尺寸可能从5到20,我们就规定一个20x20的数组使用
2。 使用一维数组代替二维数组,一般在C++中比较多,用一个类专门包装成二维数组
请参考http://blog.vckbase.com/arong/archive/2004/06/05/371.html
lingyin55 2009-05-31
  • 打赏
  • 举报
回复
自己看下这三种的区别吧
http://blog.csdn.net/upcuiling/archive/2006/04/14/663530.aspx

[Quote=引用 7 楼 ideayuye 的回复:]
"calloc"是什么东西啊? ~~~~没见过~~~~~~
[/Quote]
goodname 2009-05-31
  • 打赏
  • 举报
回复
好像给的例子还不完全是楼主的意思。

如果你需要
int arr[m][n];
的话,这样不行。

你可以使用
int *p;
p = (int *)malloc(m*n*sizeof(int));
直接申请就行了。

lingyin55 2009-05-31
  • 打赏
  • 举报
回复
//这是定义二维数组的行数,那“(int*)”里面的那个“*”是什么意思啊?
不要分开看,int*是一个类型。

//这是定义每行的列数 是吧?
对,其实就是分开两部分申请内存。
idea_yuye 2009-05-31
  • 打赏
  • 举报
回复
"calloc"是什么东西啊? ~~~~没见过~~~~~~
idea_yuye 2009-05-31
  • 打赏
  • 举报
回复
呵呵 感谢您的回答
小弟愚钝 还是有几个问题
下面是我的理解 看看对不对
int **p;
int i;

//申请空间
p = (int**)malloc(sizeof(int*)*M); //这是定义二维数组的行数,那“(int*)”里面的那个“*”是什么意思啊?
for (i=0; i<M; i++)
p[i] = (int*)malloc(sizeof(int)*N); //这是定义每行的列数 是吧?

//释放空间
for (i=0; i<M; i++)
free(p[i]);
free(p);

Lonelykun 2009-05-31
  • 打赏
  • 举报
回复
二维数组使用calloc比较形象。
lingyin55 2009-05-31
  • 打赏
  • 举报
回复
我还去找回复的帖子。。。

[Quote=引用 1 楼 goodname 的回复:]
请参考
http://topic.csdn.net/u/20090531/14/81a32bfa-4582-4302-90ce-89a8ba69dd8c.html

二楼
[/Quote]
goodname 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lingyin55 的回复:]
刚发过一次
C/C++ codeint**p;inti;//申请空间p=(int**)malloc(sizeof(int*)*M);for(i=0; i<M; i++)
p[i]=(int*)malloc(sizeof(int)*N);//释放空间for(i=0; i<M; i++)
free(p[i]);
free(p);
[/Quote]

是啊,先见之明阿,我马上就派上用场了。
lingyin55 2009-05-31
  • 打赏
  • 举报
回复
刚发过一次


int **p;
int i;

//申请空间
p = (int**)malloc(sizeof(int*)*M);
for (i=0; i<M; i++)
p[i] = (int*)malloc(sizeof(int)*N);

//释放空间
for (i=0; i<M; i++)
free(p[i]);
free(p);


goodname 2009-05-31
  • 打赏
  • 举报
回复
请参考
http://topic.csdn.net/u/20090531/14/81a32bfa-4582-4302-90ce-89a8ba69dd8c.html

二楼

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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