?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
׃软g开?/strong>认ؓQ两者都是对内存q行操作的函数。应用在多维数组上时Q需特别注意一下?/span>
首先看看两者原型?/span>
1.malloc函数Q用于从堆上分配指定字节的内存空间?/span>
void * malloc(size_t n);
n求分配的内存字节数。如果执行成功,函数q回获得的内存空间的首地址Q执行失败,q回gؓNULL?/span>
׃函数q回值值的cd为void的指针,因此Q可以将void指针cd转换后赋值给Lcd指针Q这样就可以通过操作该类型指针来操作从堆上获得的内存I间?/span>
malloc函数分配得到的内存空间是未初始化的。有时候,在用前需要对该内存空间进行初始化Q此时用上memset?/span>
2.memset函数
void * memset (void * p,int c,size_t n);
指针p为所操作的内存空间的首地址Qc为每个字节所赋的|n为所操作内存I间的字节长度,也就是内存被赋gؓc的字节数?/span>
注意的它是以字节为单位进行赋值的Q赋D围是0x00?xFF?/span>
在多l数l上的应用。如二维?/span>
double **weight; //二维数组weight[n][m]
weight=(double**)malloc(n*sizeof(double*)); //注意是sizeof里头是double*而不是double。该l装的是指针
int i=0;
for(;i<n;i++){
weight[i]=(double*)malloc(n*sizeof(double));
memset(weight[i],0,n*sizeof(double)); //正确。注意是对weight[i]Q而不是weight
}
//memset(weight,0,sizeof(n*n*sizeof(double));
//q样的统一Ҏ个二l数l初始化是错误的Q因二维数组是通过分次malloc得到的,各内存不一定连l?/span>
//但如果是直接声明的多l数l如a[5][5]Q其内存肯定是连l的Q此时统一memset没问题?/span>