1. 程式人生 > >關於C++ memset函式使用的問題

關於C++ memset函式使用的問題

1. 關於該函式

函式原型: 

memset(void *s,int ch,size_t n)

函式說明:

     memset函式是計算機中C/C++語言函式。將s所指向的某一塊記憶體中的前n個位元組的內容全部設定為ch指定的              ASCII值, 第一個值為指定的記憶體地址,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工          作, 其返回值為指向s的指標。所在標頭檔案<memory.h>或<string.h>。

     2.對於該函式的深入探究

      該函式的第二個引數ch為進行初始化的值,該值如果的範圍為0到255(00000000到11111111)。如果超過該範         圍

那麼會對該值取後8位。如果ch為字元型,那麼取其ASCII碼。

     注:以下內容僅針對範圍內,超出範圍按最後8位擷取。

      1.對bool陣列進行初始化:

       初始化結果為true或false

       (1)使用 0或1初始化 memset(prime,0,sizeof(prime));   0為false,1為true

         

       (2)使用 true或false初始化 memset(prime,true,sizeof(prime));  true為true,false為false

               

       (3)使用其它值初始化 

memset(prime,‘A’,sizeof(prime));  非0值為true,0為false(字元0取ASCII碼48,為                true)

         

       2.對char陣列進行初始化:

       (1)使用char型變數。memset(CH,‘A’,sizeof(CH));    初始化結果為對應的字元。 

           

       (2)使用int型變數。將該int值作為ASCII碼,使用對應的字元進行初始化。                

       (0到127為ASCII碼錶,其中0為NULL,128到254未知,應該為擴充套件ASCII碼。255顯示字串中字元無效。)

          memset(CH,65,sizeof(CH));  

          memset(CH,0,sizeof(CH));    

          memset(CH,255,sizeof(CH));   

       (3)使用bool型變數true或false。(true為ASCII碼1,false為ASCII碼0,初始結果同int)

       3.對int陣列進行初始化:

         僅可在初始化的值的最後8位為11111111(255)或00000000(0)時能夠正確進行初始化。也就是說int型陣列

         僅能初始化為-1和0。其餘方法均不能得到正確的結果。


      3.挖掘背後的原因

                 為什麼使用memset函式會出現這些情況呢?原因很簡單就是由於memset函式在做初始化的時候是以位元組           為單位的(1Byte,也就是8位二進位制數)。由於bool型別和char型別均為1個位元組。所以在進行初始化的時候不           會發生任何問題(bool型別在存入陣列是會進行型別轉換,0為false,非0為true)。但是一個int型變數是4個字           節,也就是32位二進位制數。那麼在初始化時會將4個用於初始化的字元組合成一個int型的值。

            例如:使用1進行初始化(memset(num,1,sizeof(num)))

            (1) 1的二進位制數為 00000001

            (2) memset函式初始化時每個位元組為   

              0000000100000001 00000001 00000001 000000010000000100000001 00000001 00000001 ..........

            (3) 此時將前4個位元組組合成一個int的數值,那麼該值為(16843009)00000001 00000001 00000001 00000001 

           所以當且僅當初始化的值為0(00000000)或-1(......11111 11111111(此時僅會使用最後8位進行初始化))時,4個              位元組進行組合後與初始化的所用的值相同。

      寫在最後第N次在使用這個函式上出現了問題。這一次做一個詳細的記錄,防止以後忘了。。

相關推薦

C++ memset()函式及其作用

1、memset函式說明   memset()的函式, 它可以一位元組一位元組地把整個陣列設定為一個指定的值。它把陣列的起始地址作為其第一個引數,第二個引數是設定陣列每個位元組的值,第三個引數是陣列的長

C++ memset函式

memset函式是計算機中C/C++語言初始化函式,將s所指向的某一塊記憶體中的後n個位元組的內容全部設定為ch指定的ASCII值,第一個值為指定的記憶體地址,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作,返回值為s。 需要的標頭檔案:在C中<string.h>

關於C++ memset函式使用的問題

1. 關於該函式 函式原型:  memset(void *s,int ch,size_t n) 函式說明:      memset函式是計算機中C/C++語言函式。將s所指向的某一塊記憶體中的前n

C/C++ — memset() 函式詳解及其作用介紹

功 能   將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ASCII值,  塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作,  其返回值為指向S的指標。 memset()函式原型是extern void *memset(void *bu

透徹分析C/C++中memset函式(轉載只為查閱方便,若有侵權立刪)

透徹分析C/C++中memset函式       在C語言中,經常需要對記憶體進行操作,裡面涉及很多函式,但是memset函式的使用有一點需要大家格外注意,這也是我在做專案時遇到過的一個問題,除錯了很久才找出來錯誤。     &nbs

[ Visual Studio C++ ] - [ MFC ] memset()函式使用講解

一.前言                memset()函式多用在socket中。 二.講解      1.函式的功能 memset()函式  用來

重新認識memset函式c++中陣列的初始化賦值

下面就好好重新認識一下這個函式,自己寫了測試的程式碼,memset到底怎麼用呢? 先貼測試程式碼: #include<iostream> #include<cstdio> #include<algorithm> #include<string>

C語言的memset()函式的使用

函式名: memset功  能: 設定s中的所有位元組為ch, s陣列的大小由n給定用  法: void *memset(void *s, char ch, unsigned n);程式例:#include <string.h>#include <stdio.h>#include &l

C++中memset()函式

前段專案中發現一個問題,程式總是在某個dynamic_cast進行動態轉換時出異常,查了半天才發現問題原來是出在memset的使用上,雖然問題本身顯而易見,但當處於幾十萬行程式碼量級中時,就變得不太那麼容易定位了。 本文歸納了下使用memset幾個需要注意的地方,雖然內容很簡單,但也希望

透徹分析C/C++中memset函式

在C語言中,經常需要對記憶體進行操作,裡面涉及很多函式,但是memset函式的使用有一點需要大家格外注意,這也是我在做專案時遇到過的一個問題,除錯了很久才找出來錯誤。 函式原型是:void *memset(void *s, int ch, size_t n);    函式功

fill和memset函式詳細說!(以及其中的inf=0x3f3f3f3f給int型賦值)【c++】

fill函式: 在標頭檔案< algorithm >中 按照單元賦值,即將一個區間中的元素都賦同一個值 fill(arr, arr + n, 要填入的內容); //普通陣列 fill(v.begin(), v.end(), -1); /

C++中memset函式的用法

//複習陣列的時候,第一次見到了memset,學之。 memset:char型初始化函式 標頭檔案:<string.h> 或 <memory.h> 函式原型:void *memset(void *s , int ch , size_t  n ) m

C++中memset函式

轉載自  http://blog.sina.com.cn/s/blog_6f611c300101e59l.htmlvoid * memset (void * S, int value, size_t num);函式作用:將ptr所指向的某一塊記憶體中的每個位元組的內容全部設定

C++二維動態陣列memset()函式初始化

先說說memset函式: void *memset(void *s,int c,size_t n)作用:將已開闢記憶體空間 s 的首 n 個位元組的值設為值 c。 memset()的內涵:用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為‘ ’

C++中的memset()函式

memset()函式可以對大記憶體的分配進行很方便的操作(初始化),所謂“初始化”,當然是指將你定義的變數或申請的空間賦予你所期望的值,例如語句int i=0;就表明定義了一個變數i,並初始化為0;如果int j=5;就

c++ fill函式,fill與memset函式的區別

【C++】fill函式,fill與memset函式的區別 memset函式 按照位元組填充某字元在標頭檔案<cstring>裡面 fill函式 按照單元賦值,將一個區間的元素都賦同一個值在標頭檔案<algorithm>裡面 因為memset

C++ — fill函式,fill與memset函式的區別

【C++】fill函式,fill與memset函式的區別 memset函式 按照位元組填充某字元 在標頭檔案<cstring>裡面 fill函式 按照單元賦值,將一個區間的元素都賦同一個值 在標頭檔案<algorithm&

C庫中的strcpy,strncpy,memcpy,memmove,memset函式

一.函式介紹: 1、memcpy 函式原型:extern void *memcpy(void *dest, const void *src, size_t count); 用法:#include<string.h> 功能:由src所指記憶體區域複製count個位

C++的fill函式memset函式

我不生產自己不熟悉的內容,我只是陌生內容的搬運工!向原作致敬! fill 的標頭檔案是<iostream> 名稱空間是std; 示範程式碼: Cpp程式碼   #include<iostream>   using namespace std;   int main()  

c++ memset函數

內存空間 class 進行 div 變量 個數 個數字 string 名稱 函數名稱:memset 函數所需頭文件:#include<cstring> 函數作用:內存賦值函數,用來給某一塊內存空間進行賦值的。 函數結構:memset(變量,一個數字,一個數字)