<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
memset是一個初始化函數,作用是將某一塊記憶體中的全部設定為指定的值。
void *memset(void *s, int c, size_t n);
需要說明的幾個地方
memset函數是按照位元組對記憶體塊進行初始化,所以不能用它將int陣列出初始化為0和-1之外的其他值(除非該值高位元組和低位元組相同)。
其實c的實際範圍應該在0~255,因為memset函數只能取c的後八位給所輸入範圍的每個位元組。也就是說無論c多大隻有後八位二進位制是有效的。
=================================================================================================
對於int a[4];
memset(a, -1, sizeof(a)) 與 memset(a, 511, sizeof(a)) 所賦值的結果一樣都為-1:
因為 -1 的二進位制碼為(11111111 11111111 11111111 11111111);511 的二進位制碼為(00000000 00000000 00000001 11111111);
後八位均為(11111111),所以陣列中的每個位元組都被賦值為(11111111)。
注意int佔四個位元組,例如a[0]的四個位元組都被賦值為(11111111),那麼a[0](11111111 11111111 11111111 11111111),即a[0] = -1。
先來看兩個例子:
例一:對char型別的陣列a初始化,設定元素全為’1’
int main(){ char a[4]; memset(a,'1',4); for(int i=0; i<4; i++){ cout<<a[i]<<" "; } return 0; }
例二:對int型別的陣列a初始化,設定元素值全為1
int main(){ int a[4]; memset(a,1,sizeof(a)); for(int i=0; i<4; i++){ cout<<a[i]<<" "; } return 0; }
1、首先要說明的第一點
對於第二個程式,陣列a是整型的,一般int所佔記憶體空間為4個位元組,所以在使用memset賦值時,下面的語句是錯誤的:
int a[4]; memset(a,1,4);
由於memset函數是以位元組為單位進行賦值的,所以上述程式碼是為陣列a的前4個位元組進行賦值,那麼所得到的執行結果就只能是:
正確的memset語句應為:
memset(a,1,16); //int所佔記憶體為4位元組的情況 memset(a,1,sizeof(a));
至於為什麼不是預期得到的1,將在下面的第二點進行說明。
當然,不同的機器上int的大小可能不同,所以最好用sizeof()函數。
2、為什麼第一個程式可以正確賦值1而第二個不可以?
這就又回到了剛剛說的第一個問題,memset函數中只能取c的後八位賦給每個位元組。
先來看一個範例:
#include<bits/stdc++.h> using namespace std; void fun1(int a[]){ memset(a,-1,sizeof(a)); } int main(){ int a[6]; fun1(a); for(int i=0; i<6; i++){ cout<<a[i]<<" "; } return 0; }
當陣列作為引數傳遞時,其傳遞的實際上是一個指標,這個指標指向陣列的首地址,如果用sizeof(a)函數得到的只是指標的長度,而不是陣列的長度。
解決方案:
在函數中加入陣列長度引數,在傳遞前先獲取陣列長度,然後將陣列長度作為引數傳遞進去。
#include<bits/stdc++.h> using namespace std; void fun1(int a[], int len){ memset(a,-1,len); } int main(){ int a[6]; int len = sizeof(a); fun1(a,len); for(int i=0; i<6; i++){ cout<<a[i]<<" "; } return 0; }
初始化陣列
char str[100]; memset(str,0,100);
清空結構體型別的變數
typedef struct Stu{ char name[20]; int cno; }Stu; Stu stu1; memset(&stu1, 0 ,sizeof(Stu)); Stu stu2[10]; //陣列 memset(stu2, 0, sizeof(Stu)*10);
此外,如果結構體中有陣列的話還是需要對陣列單獨進行初始化處理的。
memset函數在初始化處理時非常方便,但也有其侷限性,比如要注意初始化數值,要注意位元組數等等。當然,直接選擇用for迴圈或while迴圈來進行初始化也是可以的,只不過memset更快捷一些。
到此這篇關於C++中的memset用法詳解的文章就介紹到這了,更多相關memset的用法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45