Chinaunix

标题: 请问动态生成m*n的矩阵?也就是动态的二维数组?拜托了 [打印本页]

作者: woyaoxuexi    时间: 2006-03-29 08:56
标题: 请问动态生成m*n的矩阵?也就是动态的二维数组?拜托了
比如我可以用:
int * shuzu=(int *)malloc(length*sizeof(int));
用上面的语句可以生成一个length长度的一位整形数组,那么怎么生成
一个m*n的二位这个整形数组呢?这里的m和n都是动态得到的值,拜托大虾了
作者: nnnqpnnn    时间: 2006-03-29 09:12
道理是一样的,因为内存是线性的
int * shuzu=(int *)malloc(m*n*sizeof(int));
作者: 依赛特小子    时间: 2006-03-29 09:22
int **a=NULL;
a=new int b[];
for(int k=0;k<num;k++)
     {
            b[k]=new int ;
    }
作者: 撒哈拉里的鱼    时间: 2006-03-29 10:27
http://www.icylife.net/yunshu/show.php?id=236

以前为别人写过一个一维固定的动态二维数组,和二维全部变化的差不多,你看看。
作者: emacsnw    时间: 2006-03-29 14:10
原帖由 woyaoxuexi 于 2006-3-28 16:56 发表
比如我可以用:
int * shuzu=(int *)malloc(length*sizeof(int));
用上面的语句可以生成一个length长度的一位整形数组,那么怎么生成
一个m*n的二位这个整形数组呢?这里的m和n都是动态得到的值,拜托大虾了


  1. int M = 50;
  2. int N = M;
  3. int **a,i;
  4. a = new int*[M];
  5. for(i = 0;i<M;++i) a[i] = new int[N];
  6. /* use a[i][j] to reference the corresponding element in the array
  7. as if a was a two dimensional array */
复制代码

作者: westgarden    时间: 2006-03-29 16:55

  1. void *calloc(
  2.    size_t num,
  3.    size_t size
  4. );
复制代码

Allocates an array in memory with elements initialized to 0.

Parameters
num
Number of elements.

size
Length in bytes of each element.

Return Value
calloc returns a pointer to the allocated space. The storage space pointed to by the return value is guaranteed to be suitably aligned for storage of any type of object. To get a pointer to a type other than void, use a type cast on the return value.


  1. /* This program uses calloc to allocate space for
  2. * 40 long integers. It initializes each element to zero.
  3. */
  4. #include <stdio.h>
  5. #include <malloc.h>

  6. int main( void )
  7. {
  8.    long *buffer;

  9.    buffer = (long *)calloc( 40, sizeof( long ) );
  10.    if( buffer != NULL )
  11.       printf( "Allocated 40 long integers\n" );
  12.    else
  13.       printf( "Can't allocate memory\n" );
  14.    free( buffer );
  15. }

复制代码

[ 本帖最后由 westgarden 于 2006-3-29 16:58 编辑 ]
作者: hkwang66    时间: 2006-03-30 03:43
原帖由 依赛特小子 于 2006-3-29 09:22 发表
int **a=NULL;
a=new int b[];
for(int k=0;k<num;k++)
     {
            b[k]=new int ;
    }


这样代码你也能写出来?
a=new int b[];
作者: 独孤九贱    时间: 2006-03-30 09:52
原帖由 hkwang66 于 2006-3-30 03:43 发表


这样代码你也能写出来?
a=new int b[];


搞不懂,二级数组不就是一维数组吗?和变通的动态内存分配有区别么?偶觉得没有区别……
作者: hkwang66    时间: 2006-03-31 21:29
原帖由 独孤九贱 于 2006-3-30 09:52 发表


搞不懂,二级数组不就是一维数组吗?和变通的动态内存分配有区别么?偶觉得没有区别……

多维数组的确可以使用一维数组表示,比如二维数组
a[n][m]数组的a[k]元素:位置:m*s+k

[ 本帖最后由 hkwang66 于 2006-3-31 22:19 编辑 ]
作者: aero    时间: 2006-03-31 21:56
好像动态开辟的都没办法使用a[m][n]的方法来指定一个元素了吧?因为编译器并不知道抽象的“维度”。
作者: hkwang66    时间: 2006-03-31 22:26
原帖由 aero 于 2006-3-31 21:56 发表
好像动态开辟的都没办法使用a[m][n]的方法来指定一个元素了吧?因为编译器并不知道抽象的“维度”。

是的,多维数组引用时编译器一般都是转换成指针:
a[k]---------->*(*(a+s)+k)

[ 本帖最后由 hkwang66 于 2006-3-31 22:45 编辑 ]
作者: xiaoger    时间: 2006-04-01 19:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: hkwang66    时间: 2006-04-01 22:24
噢,这种分级动态分配,可以解决;受教了!
作者: hkwang66    时间: 2006-04-01 22:31
这个是我在LINUX下验证的代码,一起放上来以供参考:
#include <stdio.h>
#include <stdlib.h>
                                                                                                                                               
int main()
{
  int **buf, m=3, n=4, i,j;
                                                                                                                                               
  buf=(int **)calloc(m, sizeof(int *));
                                                                                                                                               
  for (i=0; i<m; i++)
  {
    buf[i]=(int *)malloc(n*sizeof(int));
  }
  for(i=0;i<m;i++)
  {
    for(j=0;j<n;j++)
    {
      buf[i][j]=n*i+j;
    }
  }
  for(i=0;i<m;i++)
  {
    for(j=0;j<n;j++)
    {
      printf("Values is %d\n",buf[i][j]);
    }
  }
                                                                                                                                               
  for(i=0;i<m;i++)
  {
    free(buf[i]);
  }
  free(buf);
  return 0;
}




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2