bzero和memset函数比较
bzero函数
函数原型:void bzero(void *s, int n);
头文件:#include <string.h>
功能:将字符串s的前n个字节置为0,一般来说n通常取sizeof(s),将整块空间清零。
返回值:无返回值
例子:
将一个数组清零:
char str[10];
bzero( str, sizeof(str) );
也可以将一个结构体清零:
- struct node
- {
- char a;
- int str[4];
- double b;
- };
对于结构体变量
struct node Test;
用bzero将其清零
bzero( &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清零:
memset( str,0,sizeof(str) );
将上面的Test变量清零:
memset( &Test,0,sizeof(Test) );
两个函数的使用进行分析:
之前在很多地方看到说推荐用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函数,相比来说两个参数确实更好记忆。使用这两个函数应该是因人而异,以及不同的代码环境下选择不同的函数使用吧,之前看到网上说两个函数用法不当导致程序性能变差的问题我还没有具体实验过,这里就不做探讨了。等深入研究之后再来补充性能比较。
bzero和memset函数比较相关推荐
- bzero和memset函数区别联系
bzero函数 函数原型:void bzero(void *s, int n): 头文件:#include <string.h> 功能:将字符串s的前n个字节置为0,一般来说n通常取siz ...
- bzero()与 memset()等的区别
BZERO()等的区别 bzero 原型: extern void bzero(void *s, int n); 用法: #include <string.h> 功能:置字节字符串s ...
- bzero与memset
bzero: 原型:void bzero(void *s, int n); 功能:置字节字符串s的前n个字节为零且包括'\0'. 说明:bzero无返回值,并且使用strings.h头文件,strin ...
- bzero 和memset的区别
bzero 原型:extern void bzero(void *s, int n); 用法:#include <string.h> 功能:置字节字符串s的前n个字节为零且包括'\0'. ...
- C:bzero与memset
目录 1.bzero 2.memset 3.实例 1.bzero bzero函数声明如下: /* Set N bytes of S to 0. */ extern void bzero (void * ...
- memset()函数用法及其作用
memset()函数原型是: extern void *memset(void *buffer, int c, int count) //buffer:为指针或是数组, //c:是赋给buffer的值 ...
- memset函数详细说明
1.void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c. 2.例子 #include <stdio.h> ...
- memset函数使用详解
1.void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c. 2.例子 #include void main(){ c ...
- 【转】C语言的memset函数
http://vip.6to23.com/tenax/clib/string/memset.htmlhttp://hi.baidu.com/longchengjiang/blog/item/32c0e ...
- C/C++中memset()函数
函数介绍 memset()函数的作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作. void *memset(void *s, int ch, size_t n) ...
最新文章
- 《Pro ASP.NET MVC 3 Framework》学习笔记之十七【示例项目SportsStore】
- 笑傲江湖ol更新服务器正在维护,笑傲江湖ol4月22日更新内容 调整死亡复活设置...
- python代码翻译-10 行代码,Python 教你自制屏幕翻译工具,有逼格!!
- Linux笔记2 文件权限管理
- Cpp 对象模型探索 / 深浅拷贝
- 关于c#静态构造函数
- 螺旋矩阵(递归问题)
- (转自孟岩的CSDN)理解矩阵
- python输出函数是什么_Python中打印函数使用概述,python,print,用法,总结
- 94-《纪元2205》游戏体会.(2015.11.12)
- 入门OJ 4187【周末舞会】
- 第二章 部署war包到tomcat
- 个人开源码支付收款系统源码+支持免备免签约
- rms 公式 有效值_为什麼均方根值(RMS)比平均值表达好一些?
- 解决 dyld: Library not loaded:Reason: image not found
- emule服务器无响应是什么原因,为什么,一直无响应,求大神帮忙
- Android Studio模拟器AndroidWifi连接成功但无法访问网络问题
- 数据之美(五):美不胜收的数据图(上)
- Android项目:基于Android的手机音乐播放器的设计
- Coding and Paper Letter(六十八)