资讯专栏INFORMATION COLUMN

⭐函数解析⭐|memset()函数的原理

Ryan_Li / 2568人阅读

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位进行赋值

  内存情况:
所以导致了出现

使得二进制数变为         
实际的结果->00000001 00000001 00000001 00000001
想要的结果->00000000 00000000 00000000 00000001

很明显与我们想要赋值的1, 也就是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 也就是-1

2.日常方法

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122422.html

相关文章

  • c语言中常见字符串操作函数,内存操作函数及其他函数详解

    strlen函数 1.函数原型 size_t strlen(const char *string ); 我们也可以打开MSDN查看他的原型  2.函数功能:求一个字符串指定string字符串的长度 3.strlen函数的实现: 实现的思想是这样的我们只要让一个指针指向字符串的起始位置,让他一直往后走直到遇到/0就停止在上述过程中用计数器count统计str走了多少步,count...

    reclay 评论0 收藏0
  • 通讯录小程序(C语言)

    摘要:通讯录主要由个功能增加联系人删除联系人修改联系人查找联系人按名称子排序。输入,退出通讯录。代码实现打印菜单创建一个通讯录初始化通讯录请选择退出通讯录。 通讯录小程...

    zorpan 评论0 收藏0
  • C语言-常用内存函数详解+模拟实现

    前言:博主之前有已经写过了C语言常用字符函数详解+模拟实现,感兴趣的同学可以去围观一下哦! 目录 前言: 1.内存函数 memcpy()  memmove() memcmp() memset() 2.错误信息报告函数 strerror()  perror() 1.内存函数 memcpy() 作用:内存拷贝 函数原型: 注意:count:要拷贝的字节数 函数memcpy从src位置开始向后赋值c...

    cucumber 评论0 收藏0

发表评论

0条评论

Ryan_Li

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<