bzero memset_memset是什么函数

bzero memset_memset是什么函数 bzero函数函数原型:voidbzero(void*s,intn);头文件:#include<string.h>功能:将字符串s的前n个字节置为0,一般来说n通常取sizeof(s),将整块空间清零。返回值:无返回值例子:将一个数组清零:charstr[10];bzero(str,…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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) );

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函数,相比来说两个参数确实更好记忆。使用这两个函数应该是因人而异,以及不同的代码环境下选择不同的函数使用吧,之前看到网上说两个函数用法不当导致程序性能变差的问题我还没有具体实验过,这里就不做探讨了。等深入研究之后再来补充性能比较。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182585.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号