山东软件开发认为,两者都是对内存进行操作的函数。应用在多维数组上时,需特别注意一下。
首先看看两者原型。
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没问题。