關於memset函式的使用

2021-06-20 20:21:07 字數 1181 閱讀 6240

函式原型

void *memset(void *s, int c, size_t n);

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

1.如果用memset(a,1,20);

就是對a指向的記憶體的20個位元組進行賦值,每個都用ascii為1的字元去填充,轉為二進位制後,1就是00000001,佔乙個位元組。乙個int元素是4 位元組,合一起就是1000000010000000100000001,就等於16843009,就完成了對乙個int元素的賦值了

2.memset() 函式常用於記憶體空間初始化。如:

char str[100];

memset(str,0,100); 

3.補充:某人的一點心得

memset可以方便的清空乙個結構型別的變數或陣列。

如:struct sample_struct

;對於變數

struct sample_strcut sttest;

一般情況下,清空sttest的方法:

sttest.csname[0]='\0';

sttest.iseq=0;

sttest.itype=0;

用memset就非常方便:

memset(&sttest,0,sizeof(struct sample_struct));

如果是陣列:

struct sample_struct test[10];

則memset(test,0,sizeof(struct sample_struct)*10);

另外:如果結構體中有陣列的話還是需要對陣列單獨進行初始化處理的。

因為memset是以位元組為單位就是對array指向的記憶體的4個位元組進行賦值,每個都用ascii為1的字元去填充,轉為二進位制後,1就是00000001,佔乙個位元組。乙個int元素是4位元組,合一起就是00000001000000010000000100000001,

就等於16843009,就完成了對乙個int元素的賦值了。

所以用memset對非字元型陣列賦初值是不可取的!

例如有乙個結構體some x,可以這樣清零:

memset( &x, 0, sizeof(some) );

如果是乙個結構體的陣列some x[10],可以這樣:

memset( x, 0, sizeof(some)*10 );

關於memset函式

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

關於memset函式

相信很多人都知道這個函式,也都用過,但可能很多人跟我過去一樣,認為它是賦初值函式,而不知它賦初值是八位八位進行的,知道了這句話那你之後的就都懂了。首先它是在標頭檔案string.h中,這說明了什麼呢,他操作的是字元型別,而字元型別有幾位呢,那就是八位,所以它就是按八位來賦初值的。之所以我們平時可以用...

關於memset函式

void memset void s,int ch,size t n 函式解釋 將s中當前位置後面的n個位元組 typedef unsigned int size t 用ch替換並返回s。memset 作用是在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快方法。mem...