1. 程式人生 > >c++中memset給一個struct或class初始化,賦0

c++中memset給一個struct或class初始化,賦0

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.