C 的memset()的常規使用

2021-08-15 15:59:53 字數 1580 閱讀 5723

以前寫的**都用到了memset,今天才知道memset的正確用法

memset()函式原型是extern void *memset(void *buffer, int c, int count)

memset的正規使用時用來初始化char型別的陣列,也就是說它只接受0x00到0xff的值,也就是c的範圍

c的範圍必須是ascll碼值

初學者都會有一種疑惑,為什麼有了memset這個函式為什麼還需要for迴圈對int陣列進行賦值呢,但其實這個函式的作用是將陣列以單個位元組拷貝的方式放到指定的記憶體中去

舉個例子

這樣你可能以為如果你賦值1的話會讓整個dp陣列裡的每乙個int變成1,其實不然。

1. memset是以位元組為單位,初始化記憶體塊。

當初始化乙個位元組單位的陣列時,可以用memset把每個陣列單元初始化成任何你想要的值,比如,

[cpp]view plain

copy

char

data[10];  

memset(data, 1, sizeof

(data));    

// right

memset(data, 0, sizeof

(data));    

// right

而在初始化其他基礎型別時,則需要注意,比如,

[cpp]view plain

copy

intdata[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

[cpp]view plain

copy

memset(dp,1,

sizeof

(dp));    

以上**執行後,dp陣列的內容為 00000001 00000001 00000001 00000001 轉化為十進位制後不為1

我們在很多程式中都會看到memset(a,127,sizeof(a));這樣的**,127是什麼特別的數字呢?通過基礎的進製轉換可以得知127的二進位制表示是01111111,那麼在dp陣列裡放的內容就是「01111111 01111111 01111111 01111111」,(10進製的2139062143),這樣就實現了將陣列裡的全部元素初始化為乙個很大的數的目的了,在最短路徑問題以及其他很多演算法中都是需要用到的。值得注意的是,int型別的範圍為2^31-1,大約是2147483647的樣子(如果我沒有記錯的話),所以初始化int型別的陣列也可以使用127這個數值。

如果是128呢?因為128的二進位制是10000000,那麼放的內容就是10000000 10000000 10000000 10000000,經過計算可得這個數是-2139062144。這樣就可以將陣列初始化為乙個很小的數了。

memset 函式的使用

語言 c c 標頭檔案 或 函式原型 void memset void ptr,int value,size t num 注 ptr 指向要填充的記憶體塊的指標。value 要設定的值。該值作為int傳遞,但該函式使用該值的unsigned char轉換填充記憶體塊。num 要設定為值的位元組數。解...

memset函式的使用

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

memset( 函式的使用

在前面不止一次說過,定義變數時一定要進行初始化,尤其是陣列和結構體這種占用記憶體大的資料結構。在使用陣列的時候經常因為沒有初始化而產生 燙燙燙燙燙燙 這樣的野值,俗稱 亂碼 每種型別的變數都有各自的初始化方法,memset 函式可以說是初始化記憶體的 萬能函式 通常為新申請的記憶體進行初始化工作。它...