#include
void bzero(void *s, size_t n);
@s:
目标内存的地址
@n:
需要清空的大小
无返回值
int num[10];
bzero(num,sizeof(num));
struct test_struct{
int a;
char b;
int c[10];
}test;
bzero(&test,sizeof(test));
#include
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与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’(字符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
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仍是不达预期的
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。
强制改变对齐值为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
char str[10];
memset(str,-1,sizeof(str));
printf("%s %d\n",str,str[0]);
输出:
���������� -1
因为ASIIC码中没有-1的值,所以字符串输出为乱码
struct test_struct{
char a[2];
char b;
}test;
memset(&test,-1,sizeof(test));
printf("%s %d\n",test.a,test.b );
输出:
��� -1
int num[10];
memset(num,-1,sizeof(num));
printf("%d %d\n",num[0],num[9]);
输出:
-1 -1
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语言的长时间来,对使用过的数据类型、库函数的归纳总结,在已知的东西中找到自己未知的过程。