??在初識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ò)誤的賦值方法。
但是當(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
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就非常方便,明顯優(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
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...
摘要:通訊錄主要由個(gè)功能增加聯(lián)系人刪除聯(lián)系人修改聯(lián)系人查找聯(lián)系人按名稱子排序。輸入,退出通訊錄。代碼實(shí)現(xiàn)打印菜單創(chuàng)建一個(gè)通訊錄初始化通訊錄請選擇退出通訊錄。 通訊錄小程...
前言:博主之前有已經(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...
閱讀 2975·2023-04-25 17:46
閱讀 3601·2021-11-25 09:43
閱讀 1103·2021-11-18 10:02
閱讀 3063·2021-10-14 09:43
閱讀 2785·2021-10-13 09:40
閱讀 1534·2021-09-28 09:35
閱讀 2197·2019-08-30 15:52
閱讀 3165·2019-08-30 14:06