c++中memset給一個struct或class初始化,賦0
阿新 • • 發佈:2018-12-17
memset函式的用法
- 將緩衝區設定為指定的字元。
- 下面是網上常見的說法,也就是memset函式的用法
函式功能是:將s所指向的某一塊記憶體中的前n個位元組的內容全部設定為ch指定的ASCII值, 第一個值為指定的記憶體地址,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作, 其返回值為指向s的指標,它是對較大的結構體或陣列進行清零操作的一種最快方法。
標頭檔案是:<memory.h>或<string.h>
- 我今天要探討的是,memset操作之後,記憶體中的值變成了什麼,真的是我們的期望嗎?以便以後放心的寫程式碼。
- vs2008測試程式碼:
// memset.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <string.h> struct Test { const wchar_t* name; const wchar_t* password; int i; int a[3]; char s[3]; Test(){} }; int main(int argc, _TCHAR* argv[]) { Test test; memset(&test,0,sizeof(test));//設斷點 return 0; }
- 一開始test結構體的值:
- 可以看出來都有預設值
- 使用memset函式之後:
- 可以看出來所有值都被初始化成0,指標初始化為NULL
- 這是最常用的,我上面的例子是struct,顯然class也是可以的。那麼其它型別的東東可以不可以呢?我們來看看memset函式原型:
void *memset(
void *dest,
int c,
size_t count
);
- 第一個值是void* 型別,我滴媽呀,好東西啊。
- void 指標,就是所謂的通用指標。它是一種特殊的指標,可以指向任意型別的物件。
- 所以它適用於所有型別。
- 現在我們來看一下有趣的事情:把初始化的值變成非0,比如1.
- memset開始前
- memset之後:
- 發現並沒有像0一樣,這個情況跟我們期望不一樣,指標也指向了不受控制的記憶體,成為野指標,這在程式中可能造成很大錯誤,而且不宜發現。
總結
- memset這個函式功能強大,但是要初始化要賦值0,不能賦其他值,造成結果不可預知,這樣指標也會被賦值為NULL,不會成為野指標,其它型別的物件都會賦成0.