關於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位擷取。
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)使用其它值初始化
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(變量,一個數字,一個數字)