C语言细看从头|内存清空函数

一、bzero()

#include <strings.h>

void bzero(void *s, size_t n);
@s:
	目标内存的地址
@n:
	需要清空的大小
无返回值

1、清空数组:

int num[10];
bzero(num,sizeof(num));

2、清空结构体

struct test_struct{
	int a;
	char b;
	int c[10];
}test;
bzero(&test,sizeof(test));

二、memset()

#include <string.h>

void *memset(void *s, int c, size_t n);
@s:
	目标内存地址
@c:
	需要赋值的值
@n:
	需要赋值的个数
return:
	返回s的首地址

由于memset的第二个参数,因此memset不止是可以对目标置0,也能置其他数值。

但是要注意的是:

memset是字节赋值型的因此有以下情况:
(1)单字节型可以置任意值(例如char型数组)
(2)多字节型置非0/-1的值会达不到预期(具体分析看本章第2节)

注int型的0和-1可以赋值是因为每一位都相同
0:0x0000 0000
-1:0xFFFF FFFF

清空即置0

即全部置0与bzero()作用相同,不论什么类型的数据

//char型数组
char str[10];
memset(str,0,sizeof(str));
//int 型数组
int num[10];
memset(num,0,sizeof(num));
//结构体
struct sockaddr_in serveraddr;
memset(&serveraddr,0,sizeof(serveraddr));

1、赋值非0/-1 达预期

(1)、char型数组

赋值为’1’(字符1的ASIIC码为49)

char str[10];
memset(str,49,sizeof(str));
printf("%s\n",str);
输出:
1111111111

赋值为’P’(字符P的ASIIC码为80)

char str[10];
memset(str,80,sizeof(str));
printf("%s\n",str);
输出:
PPPPPPPPPP

(2)、单字节对齐结构体

struct test_struct{
	char a[2];
	char b;
}test;

memset(&test,80,sizeof(test));
printf("%s-%c\n",test.a,test.b );
输出:
PPP-P

注:如果本身结构体对齐值不为1,强制转化为1仍是不达预期的

2、赋值非0/-1 不达预期

(1)、int型数组

int num[10];
memset(num,80,sizeof(num));
printf("%d %c\n",num[0],num[0]);
输出:
1347440720 P

1347440720其二进制为

01010000 01010000 01010000 01010000
01010000就是十进制的80,也就是说memset将 int 的4个字节分别每个字节置80

所以输出的时候转为单字节字符输出时为P,整型输出为1347440720。

(2)、非单字节对齐结构体

强制改变对齐值为1,改变的只是结构体的大小,对int型的数据memset还是一样的方式赋值。

结构体对齐值为1:

#pragma pack(1)
struct test_struct{
	char a[2];
	char b;
	int c;
}test;

memset(&test,80,sizeof(test));
printf("size:%d:%s-%c-%c\n",sizeof(test),test.a,test.b,test.c);

memset(&test,80,sizeof(test));
printf("size:%d:%s-%c-%d\n",sizeof(test),test.a,test.b,test.c);

输出:
size:7:PPPPPPP-P-P
size:7:PPPPPPP-P-1347440720

结构体对齐值不为1

//#pragma pack(1)
struct test_struct{
	char a[2];
	char b;
	int c;
}test;

memset(&test,80,sizeof(test));
printf("size:%d:%s-%c-%c\n",sizeof(test),test.a,test.b,test.c);

memset(&test,80,sizeof(test));
printf("size:%d:%s-%c-%d\n",sizeof(test),test.a,test.b,test.c);

输出:
size:8:PPPPPPPP-P-P
size:8:PPPPPPPP-P-1347440720

3、赋值-1

(1)、char型数组

char str[10];
memset(str,-1,sizeof(str));
printf("%s %d\n",str,str[0]);
输出:
���������� -1

因为ASIIC码中没有-1的值,所以字符串输出为乱码

(2)、单字节对齐结构体

struct test_struct{
	char a[2];
	char b;
}test;

memset(&test,-1,sizeof(test));
printf("%s %d\n",test.a,test.b );
输出:
��� -1

(3)、int型数组

int num[10];
memset(num,-1,sizeof(num));
printf("%d %d\n",num[0],num[9]);
输出:
-1 -1

(4)、非单字节对齐结构体

struct test_struct{
	char a[2];
	char b;
	int c;
}test;

memset(&test,-1,sizeof(test));
printf("size:%d:%d %d %d\n",sizeof(test),test.a[0],test.b,test.c);

printf("size:%d:%d %d %d\n",sizeof(test),test.a[1],test.b,test.c);

输出:
size:8:-1 -1 -1
size:8:-1 -1 -1

三、总结

memset()与bzero()可以将任意类型的数据清空即置0。
但memset()比bzero()多了可以将整段内存、单字节的置同一个数。
注意的是非单字节的类型数据,置非0/-1的数会不达预期。


细看从头,是我对于接触C语言的长时间来,对使用过的数据类型、库函数的归纳总结,在已知的东西中找到自己未知的过程。

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ySh_ppp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值