bzero函数
函数原型: voidBzero(void*s,int n );
头文件: #include string.h
功能:将字符串s的前n个字节设置为0。 一般来说,n通常取sizeof(s ),使空间整体为零。
返回值:无返回值
示例:
将数组重置为零:
char str[10];
Bero(str,sizeof ) str );
也可以将一个结构体清零。
结构节点{ char a; int str[4]; 双精度b; (; 对于结构变量
结构节点测试;
用bzero完成
Bero(test,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。
示例:
同上str清零:
短信(str,0,sizeof ) str );
将上面的Test变量清零:
memset(test,0,sizeof ) test );
分析两个函数的使用。
以前,很多地方建议使用memset函数代替bzero函数。 因为POSIX.1-2001标准已经将此函数标记为不推荐用于传统函数。 前几天,我在UNIXweb编程卷中看到作者说整本书使用bzero函数而不是memset函数。 作者是这样解释的:
bzero不是ANSI C函数,而是来自早期的Berkeley网络编程代码。 但是,整本书没有使用ANSI C的memset函数而使用它。 因为bzero(2 (带两个参数)比memset更容易记忆。
其原因是,在TCPv3艺术首次印刷时,作者在出现10个memset函数时犯了错误,调换了第二个和第三个参数。 c编译器无法发现此问题,因为两个参数的类型相同。 size_t通常被定义为unsigned int类型,但bzero函数不会出现此问题。
看到两个不同的建议,我的态度是这样的。 这两个函数使用最多的是用他们清零。 我也经常使用bzero函数而不是memset函数。 相比之下,两个参数确实更容易记忆。 使用这两个函数,应该根据不同的人和代码环境选择不同的函数来使用吧。 我以前在网上看到过两个函数的使用方法不合适导致程序性能变差的问题,但是还没有具体实验过,所以这里不做讨论。 深入研究后再补充性能比较。