C语言编程小细节|?函数解析?|memset()函数的原理
【C语言编程小细节|?函数解析?|memset()函数的原理】
文章目录
- 1.函数原理
- ?? 两个特例
- 2.日常方法
-
- 2.1初始化字节
- 2.2 初始化其他数据类型
- 2.3 初始化结构体
1.函数原理 ??在初识memset函数中,我们简单提到了memset函数引用的是
string.h 头文件,从这里我们可以看出,这是一个为字符类型设置的函数,那么他是怎么实现的?
??先看一下源码
void *(memset)(void *s, int c, size_t n)
{const unsigned char uc = c;
unsigned char *su;
for (su = s;
0 < n;
++su, --n)
*su = uc;
return (s);
}
??并且我们在前文中知道,memset函数每次是以 一个字节为单位来进行赋值的,而不是一次性赋值4/8个字节,那么问题来了,当我们以int为单位的时候,它究竟是怎样进行的?
??举个例子:
在素数筛中我们使用了
memset(arr,1,sizeof(arr));
来对数组进行初始化, 但是 arr的类型如果没有bool类型,而是int类型,那么就会导致一个结果,就是在以字节赋值的时候,int 类型每次调用4个字节(32bit),他会将32bit 分为4*8个bit,每次将最低的bit位进行赋值??内存情况:
所以导致了出现
文章图片
使得二进制数变为 ?????? ?很明显与我们想要赋值的1, 也就是00000000 00000000 00000000 00000001
实际的结果->00000001 00000001 00000001 00000001
想要的结果->00000000 00000000 00000000 00000001
是不匹配的,如果换算为10进制是一个非常大的值(16843009).是错误的赋值方法。
?? 两个特例 但是当memset()刷内存为 ?? 0 和-1的时候
答案是正确的,为什么可以正确赋值0和-1 ?
0:八位全零填充四次,得到32位的零,还是零,赋0成功 这个很简单-1:-1的低八位二进制码为11111111,填充四次,int类型还是-1,赋-1成功。
当进行存放之后,
补码->11111111 11111111 11111111 11111111根据原反补码之间的关系
我们可以知道 他的原码 10000000 00000000 00000000 00000001 也就是-12.日常方法 2.1初始化字节
char data[10];
memset(data, 1, sizeof(data));
// right
memset(data, 0, sizeof(data));
// right
2.2 初始化其他数据类型
int data[10];
memset(data, 0, sizeof(data));
// right
memset(data, -1, sizeof(data));
// right
memset(data, 1, sizeof(data));
// wrong, data[x] would be 0x0101 instead of 1
2.3 初始化结构体
struct sample_struct
{char csName[16];
int iSeq;
int iType;
};
struct sample_strcut stTest;
//一般情况下,清空stTest的方法:
stTest.csName[0]='/0';
stTest.iSeq=0;
stTest.iType=0;
//用memset就非常方便,明显优于for循环
memset(&stTest,0,sizeof(struct sample_struct));
//如果是数组:
struct sample_struct test[10];
memset(test,0,sizeof(struct sample_struct)*10);
推荐阅读
- 一个小故事,我的思考。
- 家乡的那条小河
- 一个人的碎碎念
- 野营记-第五章|野营记-第五章 讨伐梦魇兽
- 昨夜小楼听风
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 基于微信小程序带后端ssm接口小区物业管理平台设计
- 2019.4.18感恩日记
- 那件我们忽略的小事叫感恩
- 你有婚内虐待行为吗()