bzero函數
函數原型:void bzero(void *s, int n);
頭文件:#include <string.h>
功能:將字符串s的前n個字節置為0,一般來說n通常取sizeof(s),將整塊空間清零。
返回值:無返回值
例子:
將一個數組清零:
char str[10];
bzero( str, sizeof(str) );
也可以將一個結構體清零:
1 struct node 2 { 3 char a; 4 int str[4]; 5 double b; 6 }
對於結構體變量
struct node Test;
用bzero將其清零
bzero( &Test, sizeof(Test) );
例子:
同上將str清零:
memset( str,0,sizeof(str) );
將上面的Test變量清零:
memset( &Test,0,sizeof(Test) );
memset函數
函數原型:void *memset(void *s,int c,size_t n);
頭文件:#include <string.h> 或者#include <memory.h>
說明:將s中前n個字節替換為c並返回s
作用是在一段內存塊中填充某個給定的值,它是對較大的結構體或數組進行清零操作的一種最快方法
這里我們看到c是int類型的,需要注意兩點:
1)若s指向的地址是char類型的,c的值可以是任意字符值;
2)若s指向的地址不是char類型,c的值只能是-1或者0。
因為-1和0轉化成二進制后每一位都是一樣的,設int型占4個字節,則-1=0XFFFFFFFF, 0=0X00000000。
兩個函數的使用進行分析:
之前在很多地方看到說推薦用memset函數代替bzero函數,原因是在POSIX.1-2001標准里面,該函數已經被標記為了遺留函數而不推薦使用,前幾天我在UNIX網絡編程卷一當中看到作者說整本書都用bzero函數代替memset函數,作者是這樣解釋的:
bzero不是一個ANSI C函數,它起源於早期的Berkeley網絡編程代碼。不過我們在整本書中使用它而不使用ANSI C的memset函數,因為bzero(帶2個參數)比memset(帶3個參數)更好記憶。
並給出理由:在TCPv3藝術首次印刷時,作者在10處出現memset函數的地方犯了錯,互換了第二個和第三個參數。C編譯器並不能發現這個問題,因為這兩個參數的類型是相同的(size_t通常定義為unsigned int類型),然而bzero函數卻不會出現這個問題。
看了兩種不同的推薦,我的態度是這樣的:這兩個函數使用最多的就是用他們來清零,我也經常使用bzero函數而非memset函數,相比來說兩個參數確實更好記憶。使用這兩個函數應該是因人而異,以及不同的代碼環境下選擇不同的函數使用吧,之前看到網上說兩個函數用法不當導致程序性能變差的問題我還沒有具體實驗過,這里就不做探討了。等深入研究之后再來補充性能比較。
————————————————
版權聲明:本文為CSDN博主「qin_sunshine」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42235488/article/details/80589583