您身边的软件定制专家--9年开发经验为您护航

18678812288
0531-88887250

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

文章作者:济南软件开发 时间:2016年09月27日

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

  首先看看两者原型。

  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
登陆网址:www.jnydkj.cn。
联系人:王经理。