程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 深刻進修C說話中memset()函數的用法

深刻進修C說話中memset()函數的用法

編輯:關於C++

深刻進修C說話中memset()函數的用法。本站提示廣大學習愛好者:(深刻進修C說話中memset()函數的用法)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻進修C說話中memset()函數的用法正文


頭文件:

#include <string.h>

memset() 函數用來將指定內存的前n個字節設置為特定的值,其原型為:
  

 void * memset( void * ptr, int value, size_t num );

參數解釋:
ptr 為要操作的內存的指針。
value 為要設置的值。你既可以向 value 傳遞 int 類型的值,也能夠傳遞 char 類型的值,int 和 char 可以依據 ASCII 碼互相轉換。
num 為 ptr 的前 num 個字節,size_t 就是unsigned int。

【函數解釋】memset() 會將 ptr 所指的內存區域的前 num 個字節的值都設置為 value,然後前往指向 ptr 的指針。

memset() 可以將一段內存空間全體設置為特定的值,所以常常用來初始化字符數組。例如:

char str[20];
memset(str, '\0', sizeof(str)-1);

【前往值】前往指向 ptr 的指針。

留意:參數 value 雖聲明為 int,但必需是 unsigned char,所以規模在0 到255 之間。

典范:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
 // 弗成以聲明為 char *str = "http://c.biancheng.net";
 char str[] = "http://c.biancheng.net";
 memset(str, '-', 7);
 puts(str);
 system("pause");
 return EXIT_SUCCESS;
}

履行成果:

-------c.biancheng.net

優化:盡可能用memset將一個數組設置清零(帶虛類除外),而不是經由過程for輪回逐一置0
  
    上面這個例子,年夜家可以參考:3D游戲編程年夜師技能。本文其實重點是memset,緣由是在任務中,用的比擬多。
 
    例如:要清空一個float f[10000],應當用memset(f,0,sizeof(float) * 10000);
    而不是: for(int i=0; i<10000; ++i) f[i] = 0;
    固然,還可以用內嵌匯編的情勢:
   

 _asm
  {
  mov edi, f;  // edi指向數組地的目的內存的肇端處
  mov ecx, 1000/4; // 輪回次數或挪動次數
  mov eax, 0;  // 每次挪動32位數,都置0
  rep stosd;  // 挪動數據
  } 

 
    哈,這個原則有個條件,那就是帶虛的類除外,緣由是,memset將類清空,有能夠將虛表也給置0了。
有能夠是由於:類的創立分:棧上和堆上。
   假如在棧上,那末棧對象的虛函數挪用能夠會在靜態時肯定,從而繞過虛表。所以不會失足。
   但堆上就必定會失足,上面給出測試代碼:

class CMemsetVirtualTest // 測試 帶虛類,被memset為0後,虛表能否掉效
{
public:
 CMemsetVirtualTest()
 {
  memset(this,0,sizeof(CMemsetVirtualTest));
 }
 
 virtual void NormalFun()
 {
  cout<<"test: NormalFun() 虛表指針有用"<<endl;
 }
 virtual ~CMemsetVirtualTest()
 {
 cout<<"test: ~CMemsetVirtualTest() 虛表指針有用"<<endl;
 }
}; 
void testFun1() // 測試:棧上樹立的對象
{
 CMemsetVirtualTest Ctest;
 Ctest.NormalFun();
}
void testFun2() // 測試:堆上樹立的對象
{
 CMemsetVirtualTest* Ptest = new CMemsetVirtualTest();
 Ptest->NormalFun(); // 到這裡必定會暴失落
 delete Ptest;  // 假如屏障上句,到這裡也必定會暴失落
}
 
int main()
{
 CMemsetVirtualTest Ctest;// 測試:棧上樹立的對象
 Ctest.NormalFun();// 測試正常:
 
 CMemsetVirtualTest* Ptest = new CMemsetVirtualTest(); // 測試:堆上樹立的對象
 Ptest->NormalFun(); // 到這裡必定會暴失落
 delete Ptest;  // 假如屏障上句,到這裡也必定會暴失落
}

 
   即:
   在C++中,觸及虛技巧的類,他的對象內存區塊中就不純真是用戶界說這個類時看上去的那些數據構造,編譯器會在傍邊安插一些數據或代碼,用來完成呼應的虛技巧.因而當你用memset函數時會把這些編譯器安插的器械沖失落, 法式履行成果變得未知. 這時候候假如拷貝對象C++會應用memberwise拷貝, 此時編譯器既拷貝用戶界說的數據構造,還會對支撐虛技巧的相干舉措措施停止恰當的修正.
   假如對象沒有效到虛技巧, 那末便可以應用memset,就跟正常情形一樣,可以逐位拷貝.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved