成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

?函數(shù)解析?|memset()函數(shù)的原理

Ryan_Li / 2784人閱讀

1.函數(shù)原理

??在初識memset函數(shù)中,我們簡單提到了memset函數(shù)引用的是
string.h 頭文件,從這里我們可以看出,這是一個(gè)為字符類型設(shè)置的函數(shù),那么他是怎么實(shí)現(xiàn)的?
??先看一下源碼

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函數(shù)每次是以 一個(gè)字節(jié)為單位來進(jìn)行賦值的,而不是一次性賦值4/8個(gè)字節(jié),那么問題來了,當(dāng)我們以int為單位的時(shí)候,它究竟是怎樣進(jìn)行的?

??舉個(gè)例子:
在素?cái)?shù)篩中我們使用了 memset(arr,1,sizeof(arr)); 來對數(shù)組進(jìn)行初始化, 但是 arr的類型如果沒有bool類型,而是int類型,那么就會導(dǎo)致一個(gè)結(jié)果,就是在以字節(jié)賦值的時(shí)候,int 類型每次調(diào)用4個(gè)字節(jié)(32bit),他會將32bit 分為4*8個(gè)bit,每次將最低的bit位進(jìn)行賦值

??內(nèi)存情況:
所以導(dǎo)致了出現(xiàn)

使得二進(jìn)制數(shù)變?yōu)??????? ?
實(shí)際的結(jié)果->00000001 00000001 00000001 00000001
想要的結(jié)果->00000000 00000000 00000000 00000001

很明顯與我們想要賦值的1, 也就是00000000 00000000 00000000 00000001
是不匹配的,如果換算為10進(jìn)制是一個(gè)非常大的值(16843009).是錯(cuò)誤的賦值方法。

?? 兩個(gè)特例

但是當(dāng)memset()刷內(nèi)存為 ?? 0 和-1的時(shí)候
答案是正確的,為什么可以正確賦值0和-1 ?

0:八位全零填充四次,得到32位的零,還是零,賦0成功 這個(gè)很簡單

-1:-1的低八位二進(jìn)制碼為11111111,填充四次,int類型還是-1,賦-1成功。
當(dāng)進(jìn)行存放之后,

補(bǔ)碼->11111111 11111111 11111111 11111111

根據(jù)原反補(bǔ)碼之間的關(guān)系

我們可以知道 他的原碼 10000000 00000000 00000000 00000001 也就是-1

2.日常方法

2.1初始化字節(jié)

char data[10];  memset(data, 1, sizeof(data));    // right  memset(data, 0, sizeof(data));    // right  

2.2 初始化其他數(shù)據(jù)類型

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 初始化結(jié)構(gòu)體

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就非常方便,明顯優(yōu)于for循環(huán)  memset(&stTest,0,sizeof(struct sample_struct));  //如果是數(shù)組:  struct sample_struct test[10];  memset(test,0,sizeof(struct sample_struct)*10);

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/122422.html

相關(guān)文章

  • c語言中常見字符串操作函數(shù),內(nèi)存操作函數(shù)及其他函數(shù)詳解

    strlen函數(shù) 1.函數(shù)原型 size_t strlen(const char *string ); 我們也可以打開MSDN查看他的原型 ?2.函數(shù)功能:求一個(gè)字符串指定string字符串的長度 3.strlen函數(shù)的實(shí)現(xiàn): 實(shí)現(xiàn)的思想是這樣的我們只要讓一個(gè)指針指向字符串的起始位置,讓他一直往后走直到遇到/0就停止在上述過程中用計(jì)數(shù)器count統(tǒng)計(jì)str走了多少步,count...

    reclay 評論0 收藏0
  • 通訊錄小程序(C語言)

    摘要:通訊錄主要由個(gè)功能增加聯(lián)系人刪除聯(lián)系人修改聯(lián)系人查找聯(lián)系人按名稱子排序。輸入,退出通訊錄。代碼實(shí)現(xiàn)打印菜單創(chuàng)建一個(gè)通訊錄初始化通訊錄請選擇退出通訊錄。 通訊錄小程...

    zorpan 評論0 收藏0
  • C語言-常用內(nèi)存函數(shù)詳解+模擬實(shí)現(xiàn)

    前言:博主之前有已經(jīng)寫過了C語言常用字符函數(shù)詳解+模擬實(shí)現(xiàn),感興趣的同學(xué)可以去圍觀一下哦! 目錄 前言: 1.內(nèi)存函數(shù) memcpy() ?memmove() memcmp() memset() 2.錯(cuò)誤信息報(bào)告函數(shù) strerror() ?perror() 1.內(nèi)存函數(shù) memcpy() 作用:內(nèi)存拷貝 函數(shù)原型: 注意:count:要拷貝的字節(jié)數(shù) 函數(shù)memcpy從src位置開始向后賦值c...

    cucumber 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<