XML | HTML | TXT
您当前位置:软件开发 >> 新闻动态 >> 软件开发技术 >> 浏览文章

c中malloc和memset在多维数组上的应用

  山东软件开发认为,两者都是对内存进行操作的函数。应用在多维数组上时,需特别注意一下。

  首先看看两者原型。

  1.malloc函数,用于从堆上分配指定字节的内存空间。

  void * malloc(size_t n);

  n为要求分配的内存字节数。如果执行成功,函数返回获得的内存空间的首地址;执行失败,返回值为NULL。

  由于函数返回值值的类型为void的指针,因此,可以将void指针类型转换后赋值给任意类型指针,这样就可以通过操作该类型指针来操作从堆上获得的内存空间。

  malloc函数分配得到的内存空间是未初始化的。有时候,在使用前需要对该内存空间进行初始化,此时用上memset。

  2.memset函数

  void * memset (void * p,int c,size_t n);

  指针p为所操作的内存空间的首地址,c为每个字节所赋的值,n为所操作内存空间的字节长度,也就是内存被赋值为c的字节数。

  注意的它是以字节为单位进行赋值的,赋值范围是0x00~0xFF。

  在多维数组上的应用。如二维。

  double **weight; //二维数组weight[n][m]

  weight=(double**)malloc(n*sizeof(double*)); //注意是sizeof里头是double*而不是double。该维装的是指针

  int i=0;

  for(;i<n;i++){

  weight[i]=(double*)malloc(n*sizeof(double));

  memset(weight[i],0,n*sizeof(double));  //正确。注意是对weight[i],而不是weight

  }

  //memset(weight,0,sizeof(n*n*sizeof(double));

  //这样的统一对整个二维数组初始化是错误的,因为该二维数组是通过分次malloc得到的,各内存不一定连续

  //但如果是直接声明的多维数组如a[5][5],其内存肯定是连续的,此时统一memset没问题。


手机:18678812288 E-Mail:1069706080@qq.com
地址:山东省济南市舜耕路泉城公园东门园内向北50米 鲁ICP备07011972号 版权所有2008-2013 山东赢德信息科技有限公司