memset初始化類物件出錯解析

2021-06-05 14:24:12 字數 1093 閱讀 9457

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

英文釋義如下:

copies the value v (converted to type unsigned char) to the first n bytes pointed to by s; returns s.

這裡s可以是陣列名,也可以是指向某一內在空間的指標;v為要填充的值;n為要填充的位元組數,通常為sizeof(s);

使用memset時要注意的是,memset是逐字節進行填充,所以s一般為char *型。對於其它型別的s,可以填充的值有兩個,0和-1。這是因為計算機中用二進位制補碼表示數字,0和二進位制補碼為全0,-1的二進位制補碼為全1。如果要 初始化為其它的值,可以用乙個for迴圈,如:

for(int i=0;i

memset 某個結構(或其它的資料型別)在c語言中是很常見的**,其目的是對結構(或其它的資料型別)進行初始化,通常都是將變數置為null或者0。在c++ 中,針對類物件除了用建構函式初始化物件外,也可以使用memset來進行初始化操作(確實有這種情況,不得已而為之,請大家不要把雞蛋砸過來!)。但是 一定要注意以下所說的這種情況:如果類包含虛函式,則不能用 memset 來初始化類物件。下面是乙個例子:

class graphicsobject

virtual int area() {}

char* name()

};class circle: public graphicsobject

int area()

};void main()

結 果我就不說了。因為每個包含虛函式的類物件都有乙個指標指向虛函式表(vtbl)。這個指標被用於解決執行時以及動態型別強制轉換時虛函式的呼叫問題。該 指標是被隱藏的,對程式設計師來說,這個指標也是不可訪問的。當進行memset操作時,這個指標的值也要被overwrite,這樣一來,只要一呼叫虛函 數,程式便崩潰。這在很多由c轉向c++的程式設計師來說,很容易犯這個錯誤,而且這個錯誤很難查。

為了避免這種情況,記住對於有虛函式的類物件,決不能使用 memset 來進行初始化操作。而是要用預設的建構函式或其它的 init 例程來初始化成員變數。

memset初始化陣列

memset初始化陣列 結構體也可初始化 不過我在此處並未對結構體初始化.memst按位元組進行初始化,可以選擇將陣列初始化為0或初始化為 1 include include include include include using namespace std int main include i...

memset函式初始化

對於絕大多數編譯器來講,char namekey 15 與memset namekey,0x0,sizeof namekey 或memset namekey,0 sizeof namekey 這三個是一樣的。但是有的編譯器,char namekey 15 只將namekey 0 給賦值為 0 其他成...

memset函式初始化

標頭檔案 incldue 靜態陣列 int num 10 memset num,0,sizeof num 初始化為 0 memset num,1 sizeof num 初始化為 1 memset num,0x3f sizeof num 初始化為無窮大 memset num,0x3f sizeof n...