正確使用memset函式

2021-08-09 13:49:42 字數 2610 閱讀 7054

本文歸納了下使用memset幾個需要注意的地方,雖然內容很簡單,但也希望對大家有所幫助。

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

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

[cpp]view plain

copy

print

? char data[10];  

memset(data, 1, sizeof(data));    // right

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

char data[10];

memset(data, 1, sizeof(data)); // right

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

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

[cpp]view plain

copy

print

? int data[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

int data[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

2. 當結構體型別中包含指標時,在使用memset初始化時需要小心。

比如如下**中,

[cpp]view plain

copy

print

?

struct parameters ;  

parameters par;  

par.p_x = new

int[10];  

memset(&par, 0, sizeof(par));  

struct parameters ;

parameters par;

par.p_x = new int[10];

memset(&par, 0, sizeof(par));

當memset初始化時,並不會初始化p_x指向的int陣列單元的值,而會把已經分配過記憶體的p_x指標本身設定為0,造成記憶體洩漏。同理,對std::vector等資料型別,顯而易見也是不應該使用memset來初始化的。

3. 當結構體或類的本身或其基類中存在虛函式時,也需要謹慎使用memset。

這個問題就是在開頭專案中發現的問題,如下**中,

[cpp]view plain

copy

print

?

class baseparameters  

};  

class myparameters : public baseparameters  

;  myparameters my_pars;  

memset(&my_pars, 0, sizeof(my_pars));  

baseparameters* pars = &my_pars;  

//......

myparameters* my = dynamic_cast

(pars);  

class baseparameters

};class myparameters : public baseparameters

;myparameters my_pars;

memset(&my_pars, 0, sizeof(my_pars));

baseparameters* pars = &my_pars;

//......

myparameters* my = dynamic_cast(pars);

程式執行到dynamic_cast時發生異常。原因其實也很容易發現,我們的目的是為了初始化資料結構myparameters裡的data和buf,正常來說需要初始化的記憶體空間是sizeof(int) * 3 * 2 = 24位元組,但是使用memset直接初始化myparameters型別的資料結構時,sizeof(my_pars)卻是28位元組,因為為了實現多型機制,c++對有虛函式的物件會包含乙個指向虛函式表(v-table)的指標,當使用memset時,會把該虛函式表的指標也初始化為0,而dynamic_cast也使用rtti技術,執行時會使用到v-table,可此時由於與v-table的鏈結已經被破壞,導致程式發生異常。

正確使用memset

本文歸納了下使用memset幾個需要注意的地方,雖然內容很簡單,但也希望對大家有所幫助。1.memset是以位元組為單位,初始化記憶體塊。當初始化乙個位元組單位的陣列時,可以用memset把每個陣列單元初始化成任何你想要的值,比如,cpp view plain copy char data 10 m...

正確使用memset

今天做了一道素數打表的題我在使用乙個陣列記錄是否為素數的時候使用了memset,將陣列裡面的數都清為1,代表是素數,不是素數,就改成0,我在判斷這乙個數是否為素數是依據也是是0還是1,結果一直存在問題,經過我一步步的除錯竟然發現了乙個之前從未在意過的bug,memset只能將int型陣列清理成0或 ...

memset函式的正確使用(C C )

memset 用法注意 單位元組memset函式可以將乙個陣列重置為某個值 第乙個引數是void 可以寫需要重置的陣列的陣列名 第二個引數是乙個值,這個值就是用來重置陣列的 第三個引數表示需要重置陣列中多少個元素 從第乙個元素開始 比如 char str 16 memset str,a sizeof...