亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入學習C語言中memset()函數的用法

 更新時間:2015年08月26日 15:40:18   作者:蔡國武  
這篇文章主要介紹了深入學習C語言中memset()函數的用法,是C語言入門學習中的基礎知識,需要的朋友可以參考下

頭文件:

#include <string.h>

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

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

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

【函數說明】memset() 會將 ptr 所指的內存區(qū)域的前 num 個字節(jié)的值都設置為 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;
}

執(zhí)行結果:

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

優(yōu)化:盡量用memset將一個數組設置清零(帶虛類除外),而不是通過for循環(huán)逐個置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; // 循環(huán)次數或移動次數
  mov eax, 0;  // 每一次移動32位數,都置0
  rep stosd;  // 移動數據
  } 

 
    哈,這個準則有個前提,那就是帶虛的類除外,原因是,memset將類清空,有可能將虛表也給置0了。
有可能是因為:類的創(chuàng)建分:棧上和堆上。
   如果在棧上,那么棧對象的虛函數調用可能會在靜態(tài)時確定,從而繞過虛表。所以不會出錯。
   但堆上就一定會出錯,下面給出測試代碼:

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++中,涉及虛技術的類,他的對象內存區(qū)塊中就不單純是用戶定義這個類時看上去的那些數據結構,編譯器會在當中安插一些數據或代碼,用來實現響應的虛技術.于是當你用memset函數時會把這些編譯器安插的東西沖掉, 程序執(zhí)行結果變得未知. 這時候如果拷貝對象C++會使用memberwise拷貝, 此時編譯器既拷貝用戶定義的數據結構,還會對支持虛技術的相關設施進行適當的修改.
   如果對象沒有用到虛技術, 那么就可以使用memset,就跟正常情況一樣,可以逐位拷貝.

相關文章

  • C++進程的創(chuàng)建和進程ID標識詳細介紹

    C++進程的創(chuàng)建和進程ID標識詳細介紹

    傳統的C++(C++98)中并沒有引入線程這個概念。linux和unix操作系統的設計采用的是多進程,進程間的通信十分方便,同時進程之間互相有著獨立的空間,不會污染其他進程的數據,天然的隔離性給程序的穩(wěn)定性帶來了很大的保障
    2022-08-08
  • 基于Qt實現視頻播放器功能

    基于Qt實現視頻播放器功能

    本文通過實例代碼給大家介紹了基于Qt實現視頻播放器功能,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-09-09
  • C語言自動生成enum值和名字映射代碼

    C語言自動生成enum值和名字映射代碼

    這篇文章主要介紹了C語言自動生成enum值和名字映射代碼的相關資料,需要的朋友可以參考下
    2015-12-12
  • C語言中用于產生隨機數的函數使用方法總結

    C語言中用于產生隨機數的函數使用方法總結

    這篇文章主要介紹了C語言中用于產生隨機數的函數使用方法總結,分別介紹了rand()函數和srand()函數以及封裝出的arc4random()函數,需要的朋友可以參考下
    2016-05-05
  • C語言 數據結構之數組模擬實現順序表流程詳解

    C語言 數據結構之數組模擬實現順序表流程詳解

    順序表,全名順序存儲結構,是線性表的一種,線性表用于存儲邏輯關系為“一對一”的數據,順序表自然也不例外,不僅如此,順序表對數據的物理存儲結構也有要求,跟隨下文來具體了解吧
    2021-11-11
  • C語言中#define在多行宏定義出錯的原因及分析

    C語言中#define在多行宏定義出錯的原因及分析

    這篇文章主要介紹了C語言中#define在多行宏定義出錯的原因及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++實踐數組作數據成員的參考

    C++實踐數組作數據成員的參考

    今天小編就為大家分享一篇關于C++實踐數組作數據成員的參考,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C++實現LeetCode(兩個有序數組的中位數)

    C++實現LeetCode(兩個有序數組的中位數)

    這篇文章主要介紹了C++實現LeetCode(兩個有序數組的中位數),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C語言指針用法總結

    C語言指針用法總結

    本文詳細講解了C語言指針用法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • c語言malloc函數的用法示例和意義

    c語言malloc函數的用法示例和意義

    mallo函數返回的實際是一個無類型指針,必須在其前面加上指針類型強制轉換才可以使用,這篇文章主要介紹了c語言malloc函數的用法示例和意義,需要的朋友可以參考下
    2022-12-12

最新評論