參照大佬部落格:點選打開連結
頭檔案:string.h,它是以位元組為機關進行填充的,起調用過程涉及三個參數,分别是首位址,每位元組填充的數(由源碼可知,如果該數超過一位元組,隻截取最後一位元組,也就是後八個二進制位),總位元組數。
下面來看memset的實作:(代碼來自《C标準庫》P398)
memset(arr,0,n*sizeof(int));
void *(memset) (void *s,int c,size_t n)
{
const unsigned char uc = c; //unsigned char占1位元組,意味着隻截取c的後八位
unsigned char *su;
for(su = s;0 < n;++su,--n)
*su = uc;
return s;
}
對于上述的這樣一個調用,for循環執行4*n次,int占4個位元組。
memset效率問題,這裡給出測試:
#include <string.h>
#define MAXSIZE 100000
int main()
{
char arr[MAXSIZE];
for(int i=0;i<10000;i++)
{
memset(arr,'0',sizeof(arr));
// for(int j=0;j<MAXSIZE;j++)
// arr[0] = '0';
}
return 0;
}
程式裡的注釋部分與memset行分别使用,結果是使用memset的程式運作時間大約為0.1s,而用for循環的程式要3s多。
綜上:memset()可以用在字元數組的初始化以及類似于memset(arr,0,n*sizeof(int));的情況,效率比手動指派要高的多。