??在初識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
char data[10]; memset(data, 1, sizeof(data)); // right memset(data, 0, sizeof(data)); // right
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
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
strlen函數 1.函數原型 size_t strlen(const char *string ); 我們也可以打開MSDN查看他的原型 ?2.函數功能:求一個字符串指定string字符串的長度 3.strlen函數的實現: 實現的思想是這樣的我們只要讓一個指針指向字符串的起始位置,讓他一直往后走直到遇到/0就停止在上述過程中用計數器count統計str走了多少步,count...
前言:博主之前有已經寫過了C語言常用字符函數詳解+模擬實現,感興趣的同學可以去圍觀一下哦! 目錄 前言: 1.內存函數 memcpy() ?memmove() memcmp() memset() 2.錯誤信息報告函數 strerror() ?perror() 1.內存函數 memcpy() 作用:內存拷貝 函數原型: 注意:count:要拷貝的字節數 函數memcpy從src位置開始向后賦值c...
閱讀 2970·2023-04-25 17:46
閱讀 3596·2021-11-25 09:43
閱讀 1102·2021-11-18 10:02
閱讀 3060·2021-10-14 09:43
閱讀 2779·2021-10-13 09:40
閱讀 1530·2021-09-28 09:35
閱讀 2191·2019-08-30 15:52
閱讀 3164·2019-08-30 14:06