memset 實現及細節

2021-09-07 06:39:53 字數 2406 閱讀 7075

memset是計算機中c/c++語言函式。將s所指向的某一塊記憶體中的前n個 位元組的內容全部設定為ch指定的ascii值, 塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作, 其返回值為指向s的指標。

標頭檔案:或

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

函式解釋:將s中前n個位元組替換為ch並返回s;

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

一維陣列的動態分配,初始化和撤銷都好說,幾乎每一本c++教材都會做出詳細的說明。具體如下:

動態分配(例如分配10個單元的): int *array=new int [10];

初始化:memset(array,0,sizeof(array));       (也可以利用乙個for迴圈對其賦值初始化)

撤銷:delete array;

下面來說二維陣列的。

二維陣列(n行m列)利用new來進行動態分配實際上相當於對n個m元陣列進行動態分配,只不過我們不能一味的按照動態分配一維陣列的方法來這項操作。msvc目前還沒有這般的人性化,具體應該這樣做:

int **array;

array=new int *[10];

for(int i=0;i<10;i++)

array[i]=new int [5];

上面的操作完成了乙個10行5列的二維陣列array[10][5]的動態分配,可以看到我們先動態分配了乙個10單元的陣列的指標的指標的首位址**array,然後再對其每個首位址進行遍歷,同時完成乙個5單元的陣列的動態分分配,並把首位址給*array[i],從而最終完成了二維陣列array[10][5]的動態分配。我們可以依此類推得到三維以至多維的陣列的動態分配方法。

二維陣列的初始化:如果把一維陣列初始化辦法照搬過來就會發現對於動態分配的二維陣列並不適用。這就要理解到memset這個函式三個引數的含義。msdn對memset的描述如下:

memset

sets buffers to a specified character.

void*memset(void*dest,intc,size_tcount);

可見memset只能作用於乙個一維陣列void*dest,因此最好的辦法就是和二維陣列的動態分配結合起來,new乙個,memset乙個。具體寫法如下:

int **array;

array=new int *[10];

for(int i=0;i<10;i++)

編譯平台:

microsoft visual c++ 6.0

也不一定就是把內容全部設定為ch指定的ascii值,而且該處的ch可為int或者其他型別,並不一定要是char型別。例如下面這樣:

int array[5] = ;

for(int i = 0; i < 5; i++)

coutfor(int k = 0; k < 5; k++)

cout1 4 3 5 2

0 0 0 0 0

後面的表大小的引數是以位元組為單位,所以,對於int或其他的就並不是都乘預設的1(字元型)了。而且不同的機器上int的大小也可能不同,所以最好用sizeof()。 

要注意的是,memset是對位元組進行操作,所以上述程式如果改為

int array[5] = ;

for(int i = 0; i < 5; i++)

coutfor(int k = 0; k < 5; k++)

cout1 4 3 5 2

16843009 16843009 16843009 16843009 16843009

為什麼呢?

因為memset是以位元組為單位就是對array指向的記憶體的5個位元組進行賦值,每個都用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函式

原始思路 剛開始學習遞迴,開始的思路是直接暴力遞迴,當a,b,c為1 10的計算時還可以計算出結果,但是當數值變大後,一直得不出結果 上網查後得到新的方法 將計算後的資料儲存在三維陣列中,未計算的資料通過遞迴計算得到。以下為 標頭檔案 memory.h memset void s,int ch,si...

memset函式原始碼實現

void memset void dst,int val,size t count 將dst所指向的某一塊記憶體中的前count個 位元組的內容全部設定為val指定的 ascii 值,第乙個值為指定的記憶體位址,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作,其返回值為指向s的指...

C 中的memset實現

memset 原型 extern void memset void buffer,int c,int count 用法 i nclude 功能 把buffer所指記憶體區域的前count個位元組設定成字元c。說明 返回指向buffer的指標。可用array.clear實現 c sharp view ...