bcopy、bzero和bcmp是傳統BSD的函數,屬於POSIX標準,是在linux下的函數;mem*是C90(以及C99)標準的C函數。區別在於,如果你打算把程序弄到一個符合C90/C99,但是不符合POSIX標準的平臺時,後者比較有優勢。
NetBSD的代碼中有很多地方使用mem*(他們更偏愛mem*,以利於移植),即使內核也是如此,而FreeBSD的內核中則儘量避免使用(希望儘可能避免在內核中出現較多的C函數)。如果你提交代碼的話需要注意這些約定
memset函數
——memset是對字節進行操作
功 能: 將s所指向的某一塊內存中的每個字節的內容全部設置爲ch指定的ASCII值。即將指定的內存,以字節爲單位,置爲ch所代表的內存形式。塊的大小由第三個參數指定,這個函數通常爲新申請的內存做初始化工作。
用 法: void *memset(void *s, char ch, unsigned n);
原 理:以字節爲單位複製內存的二進制形式,到指定的內存區域。
(注:第二個數字也可以是int型,然後截取該int變量的最低字節。作爲複製的二進制模板。所以第二個字節最常見的是0全部置零 或 -1全部置1。)
用 途:memset最常見的用途是對struct做初始化工作
memset(結構體的地址,0,sizeof(結構體)) ;
bzero函數
原型:extern void bzero(void *s, int n);
用法:#include <string.h>
功能:將以地址s開頭的的前n個字節爲零。
說明:bzero無返回值。bzero只能在linux下調用
同族——memcrp函數 vs strcry函數
memcpy用來做內存拷貝,你可以拿它拷貝任何數據類型的對象,可以指定拷貝的數據長度。
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
功能:由src所指內存區域複製count個字節到dest所指內存區域。
說明:src和dest所指內存區域不能重疊,函數返回指向dest的指針
strcpy就只能拷貝字符串了,它遇到'/0'就結束拷貝
原型:extern char *strcpy(char *dest,char *src);
功能:把src所指由NULL結束的字符串複製到dest所指的數組中。
說明:src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字符串。
bcopy
原型:extern void bcopy(const void *src, void *dest, int n);
用法:#include <string.h>
功能:將字符串src的前n個字節複製到dest中
說明:bcopy不檢查字符串中的空字節NULL,函數沒有返回值。
目標和源的位置與memcpy和strcpy不同。
bcmp
原型:extern int bcmp(const void *s1, const void *s2, int n);
用法:#include <string.h>
功能:比較字符串s1和s2的前n個字節是否相等
說明:如果s1=s2或n=0則返回零,否則返回非零值。bcmp不檢查NULL。
memcmp
原型:extern int memcmp(void *buf1, void *buf2, unsigned int count);
用法:#include <string.h>
功能:比較內存區域buf1和buf2的前count個字節。
說明:當buf1<buf2時,返回值<0
當buf1=buf2時,返回值=0
當buf1>buf2時,返回值>0