糾正memset函式的用法

2021-08-26 05:59:51 字數 967 閱讀 1453

函式宣告:void *memset(void *s, int c, size_t n);

memset:作用是在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快方法。

一:普通理解

大家平時用的最多的就是對乙個陣列進行初始化。

例如int data[100];

memset(data, 0, sizeof(data));

函式目的就是將data陣列所有元素初始化為0. 有人經常把第三個引數寫成:sizeof(int) * 100;其實也是一樣的。具體原因稍後描述。

二:值得糾正和注意的地方

1.示例:memset(data, 1, sizeof(data))。顯然目的是想將data的所有元素初始化成1,經過實驗,發現不對,記憶體中出現大量的16843009。

不是我們想要的1。

原因剖析,memset函式是以位元組為單位進行賦值的,他經常應用在對乙個字串的所有元素賦值。

例如char data[20];

memset(data, '#', sizeof(data));

而示例1中的data是整型的,使用 memset還是按位元組賦值,就是對data指向的記憶體的100個位元組進行賦值,每個都用ascii為1的字元去填充,轉為二進位制後,1就是00000001,佔乙個位元組。乙個int元素是4 位元組,合一起就是00000001000000010000000100000001,就等於16843009,就完成了對乙個int元素的賦值了。這樣賦值完以後,每個陣列元素的值實際上是0x01010101即十進位制的16843009。你看看你輸出結果是否這樣?所以大家一定要記住memset是以位元組為單位進行複製的。所以前面提到的關於第三個引數的兩種寫法都是正確的,應為他都是這個陣列所佔的位元組個數。所以第三個引數你還可以直接寫成100(對於前面那個例子)。 也能感受到memset用於把整型陣列初始化為0,完全是對記憶體比較了解或者投機取巧的人弄出來的。我們用的時候一定要小心,要理解其原理。不然就會犯很多錯誤。

memset 函式用法

memset 原型 extern void memset void buffer,int c,int count 用法 include 功能 把buffer所指記憶體區域的前count個位元組設定成字元c。說明 返回指向buffer的指標。用來對一段記憶體空間全部設定為某個字元。舉例 char a ...

memset函式用法

樓主希望通過庫函式memset 來對乙個陣列進行初始化,需要了解一下該函式的工作原理。庫函式memset 是針對位元組操作的,其中第二個引數值被賦給第乙個引數指向的記憶體位址開始的每乙個位元組,因此,這種初始化其實存在侷限性,也導致其主要用於清除陣列內容等。比如 假設i 0,1,2,memset a...

memset函式用法

將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ascii值,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作,其返回值為指向s的指標。在c中 or 在c 中 void memset void s,int ch,size t n 函式解釋 將s中前n個 位元組替換為...