山東軟件開發認為,兩者都是對內存進行操作的函數。應用在多維數組上時,需特別注意一下。
首先看看兩者原型。
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
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沒問題。