×

bzero s zero

linux系统 bzero(&(server addr,ADDR size))函数怎样来的,怎样实现清零作用的急!谢谢?bzero(&(serv_addr.sin_zero),8)啥意思

admin admin 发表于2022-09-18 18:36:40 浏览181 评论0

抢沙发发表评论

本文目录

linux系统 bzero(&(server addr,ADDR size))函数怎样来的,怎样实现清零作用的急!谢谢


void __bzero (void *s, size_t len);
/*
将s的前len字节设为0
思路:先对齐到4的倍数的地址上,对前面的几B直接赋。然后,每次赋个32B,剩余凑不够32B的,
每次赋4B,剩余凑不够4B的,直接赋
*/
void __bzero (void *s, size_t len)
{
long int dstp = (long int) s;
const op_t zero = 0;
if (len 》= 8)
{
size_t xlen;
// 处理前面的几B,直到地址为4的倍数,然后可以每次4B
// 这样做的原因与结构体对齐的原因一样,是为提高读写数据的效率
// 由于len 》= 8 ,OPSIZ=4,所以不必担心len==0
while (dstp % OPSIZ != 0) // #define op_t unsigned long int
// #define OPSIZ (sizeof(op_t))
// IA-32下是32
{
((byte *) dstp) = 0;
dstp += 1;
len -= 1;
}
// 下面是典型的循环展开以提高效率,每次32B
// 若每次赋一个4B,程序会由于跳转太多而打断cpu流水线,降低效率
// http://www.lysator.liu.se/c/duffs-device.html
// 关键字:Duff’s Device
xlen = len / (OPSIZ * 8);
while (xlen != 0)
{
((op_t *) dstp) = zero;
((op_t *) dstp) = zero;
((op_t *) dstp) = zero;
((op_t *) dstp) = zero;
((op_t *) dstp) = zero;
((op_t *) dstp) = zero;
((op_t *) dstp) = zero;
((op_t *) dstp) = zero;
dstp += 8 * OPSIZ;
xlen -= 1;
}
len %= OPSIZ * 8; // 剩余的凑不足8 op_t 的
xlen = len / OPSIZ;
while (xlen != 0) // 每次填4B
{
((op_t *) dstp) = zero;
dstp += OPSIZ;
xlen -= 1;
}
len %= OPSIZ;
}
while (len != 0) // 剩余不够4B的,直接赋值
{
((byte *) dstp) = 0;
dstp += 1;
len -= 1;
}
}

bzero(&(serv_addr.sin_zero),8)啥意思


(&(serv_addr.sin_zero)是指针变量,8是指取指针变量的前8个变量,而整句话的意思就是:置指针变量(&(serv_addr.sin_zero)中前8个变量的值为零.

strset是什么意思啊bzero又是什么意思啊


原型:extern char *strset(char *s, char c);

用法:#include 《string.h》

功能:把字符串s中的所有字符都设置成字符c。

说明:返回指向s的指针。

举例:
// strset.c

#include 《syslib.h》
#include 《string.h》
main()
{
char *s=“Golden Global View“;

clrscr();

strset(s,’G’);
printf(“%s“,s);
getchar();
return 0;
}
原型:extern void bzero(void *s, int n);
用法:#include 《string.h》

功能:置字节字符串s的前n个字节为零。

说明:bzero无返回值。

举例:
// bzero.c

#include 《syslib.h》
#include 《string.h》
main()
{
struct
{
int a;
char s;
float f;
} tt;

char s;

bzero(&tt,sizeof(tt)); // struct initialization to zero
bzero(s,20);

clrscr();
printf(“Initail Success“);
getchar();
return 0;
}
-zero

C语言中的数据结构问题


/*
你好, 程序思路是:
先把输入的东西一起入栈和入队列.
如Q, a, b, c, b, a
S, a, b, c ,b, a
等用户输入@后, Q出队列, S出栈,
判断两个出栈的内容是否一致, 是否同是为空, 如果不是, 说明不是回文.
// 此程序运行正确.
*/
#include 《stdio.h》
#include 《stdlib.h》
#include 《malloc.h》
#include 《string.h》
#define MAXSIZE 100
/*#include “debug_zhu.h“*/
typedef char DataType;
typedef struct{
DataType data;
int top;
}SeqStack,*PSeqStack;
typedef struct{
DataType data;
int front,rear;
}SeqQueue,*PSeqQueue;
PSeqStack Init_SeqStack(void)
{
PSeqStack S;
S=(PSeqStack)malloc(sizeof(SeqStack));
bzero(S, sizeof( SeqStack));
if(S)
S-》top=-1;
return S;
}
char Push_SeqStack(PSeqStack S,DataType x)
{
if (S-》top==MAXSIZE-1){
return 0;
} else {
S-》top++;
S-》data=x;
return 1;
}
}
char Empty_SeqStack(PSeqStack S)
{
if(S-》top==-1){
return 1;
} else{
return 0;
}
}
char Pop_SeqStack(PSeqStack S,DataType *x)
{
if(Empty_SeqStack(S)){
return -1; // 失败为 -1 // zhuxh 出栈和出队列的返回值要一致.
} else {
*x=S-》data;
S-》top--;
return 0; // 成功为 0 // zhuxh
}
}
PSeqQueue Init_SeqQueue()
{
PSeqQueue Q;
Q=(PSeqQueue)malloc(sizeof(SeqQueue));
bzero(Q, sizeof( SeqQueue));
if(Q){
Q-》front=0;
Q-》rear=0;
}
return Q;
}
char Empty_SeqQueue(PSeqQueue Q)
{
if(Q && Q-》front==Q-》rear)
return (1);
else
return (0);
}
char In_SeqQueue(PSeqQueue Q,DataType x)
{
if( (Q-》rear+1)%MAXSIZE == Q-》front) {
printf(“队满“);
return -1;
} else {
Q-》rear=(Q-》rear+1)%MAXSIZE;
Q-》data=x;
return 1;
}
}
char Out_SeqQueue(PSeqQueue Q,DataType *x)
{
if(Empty_SeqQueue(Q))
{
printf(“队空“);
return -1;
} else {
Q-》front=(Q-》front+1)%MAXSIZE;
*x=Q-》data;
return 0;
}
}
int compare(char ch)
{
char ch_Statck;
char ch_Queue;
PSeqStack S;
S = Init_SeqStack();
Push_SeqStack(S,ch);
PSeqQueue Q;
Q = Init_SeqQueue();
In_SeqQueue(Q, ch);
bool bIn = true; // 入栈.
while( (ch = getchar())!=’@’) {
Push_SeqStack(S, ch);
In_SeqQueue(Q, ch);
}
printf(“ Queue = %s \n“, Q-》data + 1 );
printf(“ stack = %s \n“, S-》data );
int ret = -1;
do{
// 请确保 Out_SeqQueue 和 Pop_SeqStack 返回值一致.
if( Out_SeqQueue(Q, &ch_Queue ) == 0 && Pop_SeqStack(S, &ch_Statck ) == 0 ){
if( ch_Queue != ch_Statck ){
/*printf(“111!!!!!!!! \n“);*/
break;
}
}else{
/*printf(“222 !!!!!!!! \n“);*/
break;
}
/*printf(“ ch_Queue = %c , ch_Statck = %c“, ch_Queue, ch_Statck );*/
}while (1);
if( (ch_Queue == ch_Statck) && (Empty_SeqQueue(Q) && Empty_SeqStack(S))){
printf(“\n 匹配\n“);
}else {
// 未完成比较
printf(“\n 不匹配\n“);
}
// 要记得内存释放.
free( Q );
Q = NULL;
free(S);
S = NULL;
}
int main(int argc, char ** argv )
{
char a;
printf(“请输入字符串“);
scanf(“%c“,&a);
compare(a);
return 0;
}
-s

C语言 bzero和memset有什么区别


bzero
  原型:extern void bzero(void *s, int n);  用法:#include 《string.h》  功能:置字节字符串s的前n个字节为零且包括‘\0’。  说明:bzero无返回值,并且使用strings.h头文件,strings.h曾经是posix标准的一部分,但是在POSIX.1-2001标准里面,这些函数被标记为了遗留函数而不推荐使用。在POSIX.1-2008标准里已经没有这些函数了。推荐使用memset替代bzero。

  void *memset(void *s, int ch, size_t n);  函数解释:将s中前n个字节替换为ch并返回s;  memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。  常见的三种错误  第一: 搞反了ch 和 n的位置.  一定要记住 如果要把一个char a;  memset(buffer, 0, sizeof((char)*20));  strcpy(buffer, “123“);  这里的memset是多余的. 因为这块内存马上就被覆盖了, 清零没有意义.  第三: 其实这个错误严格来讲不能算用错memset, 但是它经常在使用memset的场合出现

关于字符数组的初始化,在项目的压力测试中,发现性能明显下降,变怀疑在程序中的若干临时字符数组的初始化(使用bzero)身上。于是修改为首个字符置零的方式而非全部置零的方式初始化,响应得到明显的提升。原来在mp3检索的每一条结果都要进行bzero对临时数组初始化,每一个请求需要30次的bzero对临时数组的置零。于是想到了,在非必要的情况下,只对临时数组的第一个(或前几个)字符置零的初始化方式对比与使用bzero的话,能够明显提高性能。
-zero

bzero(&(dest_addr.sin_zero),;这句对吗&什么意思


此函的功能是置字节字符串s的前n个字节为零。
&表示这个字符串的地址。
其中的分号应该改为逗号。
此函数原型:
extern void bzero(void *s, int n);

在栈空间的数据可以用bzero 函数吗


栈:特点就是一个先进后出的结构。
栈的应用:非常广泛,在CPU内部就有提供栈这个机制。主要用途:函数调用和返回,数字转字符,表达式求值,走迷宫等等。
在CPU内部栈主要是用来进行子程序调用和返回,中断时数据保存和返回。在编程语言中:主要用来进行函数的调用和返回。
可以说在计算机中,只要数据的保存满足先进后出的原理,都优先考虑使用栈,所以栈是计算机中不可缺的机制。
-s