国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

Ryan_Li / 2778人閱讀

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/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元查看
<