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

C++中的memset用法詳解

 更新時間:2023年02月04日 11:25:31   作者:薛定諤的貓ovo  
memset是一個初始化函數(shù),作用是將某一塊內(nèi)存中的全部設(shè)置為指定的值,本文給大家介紹C++中的memset用法,感興趣的朋友跟隨小編一起看看吧

memset簡介

memset是一個初始化函數(shù),作用是將某一塊內(nèi)存中的全部設(shè)置為指定的值。

void *memset(void *s, int c, size_t n); 
  • s指向要填充的內(nèi)存塊。
  • c是要被設(shè)置的值。
  • n是要被設(shè)置該值的字符數(shù)。
  • 返回類型是一個指向存儲區(qū)s的指針。

需要說明的幾個地方

一、不能任意賦值

memset函數(shù)是按照字節(jié)對內(nèi)存塊進(jìn)行初始化,所以不能用它將int數(shù)組出初始化為0和-1之外的其他值(除非該值高字節(jié)和低字節(jié)相同)。
其實c的實際范圍應(yīng)該在0~255,因為memset函數(shù)只能取c的后八位給所輸入范圍的每個字節(jié)。也就是說無論c多大只有后八位二進(jìn)制是有效的。

=================================================================================================
對于int a[4];
memset(a, -1, sizeof(a)) 與 memset(a, 511, sizeof(a)) 所賦值的結(jié)果一樣都為-1:
因為 -1 的二進(jìn)制碼為(11111111 11111111 11111111 11111111);511 的二進(jìn)制碼為(00000000 00000000 00000001 11111111);
后八位均為(11111111),所以數(shù)組中的每個字節(jié)都被賦值為(11111111)。
注意int占四個字節(jié),例如a[0]的四個字節(jié)都被賦值為(11111111),那么a[0](11111111 11111111 11111111 11111111),即a[0] = -1。

二、注意所要賦值的數(shù)組的元素類型

先來看兩個例子:
例一:對char類型的數(shù)組a初始化,設(shè)置元素全為’1’

int main(){
    char a[4];
    memset(a,'1',4);
    for(int i=0; i<4; i++){
        cout<<a[i]<<" ";
    }
    return 0;
}

在這里插入圖片描述

例二:對int類型的數(shù)組a初始化,設(shè)置元素值全為1

int main(){
    int a[4];
    memset(a,1,sizeof(a));
    for(int i=0; i<4; i++){
        cout<<a[i]<<" ";
    }
    return 0;
}

在這里插入圖片描述

1、首先要說明的第一點(diǎn)

 對于第二個程序,數(shù)組a是整型的,一般int所占內(nèi)存空間為4個字節(jié),所以在使用memset賦值時,下面的語句是錯誤的

int a[4];
memset(a,1,4);

由于memset函數(shù)是以字節(jié)為單位進(jìn)行賦值的,所以上述代碼是為數(shù)組a的前4個字節(jié)進(jìn)行賦值,那么所得到的執(zhí)行結(jié)果就只能是:

在這里插入圖片描述

正確的memset語句應(yīng)為:

memset(a,1,16); //int所占內(nèi)存為4字節(jié)的情況
memset(a,1,sizeof(a));

至于為什么不是預(yù)期得到的1,將在下面的第二點(diǎn)進(jìn)行說明。

當(dāng)然,不同的機(jī)器上int的大小可能不同,所以最好用sizeof()函數(shù)

2、為什么第一個程序可以正確賦值1而第二個不可以?

這就又回到了剛剛說的第一個問題,memset函數(shù)中只能取c的后八位賦給每個字節(jié)

  • 第一個程序中,數(shù)組a是字符型的,字符型占據(jù)的內(nèi)存大小就是1Byte,而memset函數(shù)也是以字節(jié)為單位進(jìn)行賦值的,所以輸出正確。
  • 第二個程序中,數(shù)組a是整型的,整型占據(jù)的內(nèi)存大小為4Byte,而memset函數(shù)還是按照字節(jié)為單位進(jìn)行賦值,將1(00000001)賦給每一個字節(jié)。那么對于a[0]來說,其值為(00000001 00000001 00000001 00000001),即十進(jìn)制的16843009。

關(guān)于所要賦值的字符數(shù)的寫法

先來看一個示例:

#include<bits/stdc++.h>
using namespace std;

void fun1(int a[]){
    memset(a,-1,sizeof(a)); 
}

int main(){
    int a[6];
    fun1(a);
    for(int i=0; i<6; i++){
        cout<<a[i]<<" ";
    }
    return 0;
}

當(dāng)數(shù)組作為參數(shù)傳遞時,其傳遞的實際上是一個指針,這個指針指向數(shù)組的首地址,如果用sizeof(a)函數(shù)得到的只是指針的長度,而不是數(shù)組的長度。

解決方案:
在函數(shù)中加入數(shù)組長度參數(shù),在傳遞前先獲取數(shù)組長度,然后將數(shù)組長度作為參數(shù)傳遞進(jìn)去。

#include<bits/stdc++.h>
using namespace std;

void fun1(int a[], int len){
    memset(a,-1,len); 
}

int main(){
    int a[6];
    int len = sizeof(a);
    fun1(a,len);
    for(int i=0; i<6; i++){
        cout<<a[i]<<" ";
    }
    return 0;
}

具體用法實例

初始化數(shù)組

char str[100];
memset(str,0,100);

清空結(jié)構(gòu)體類型的變量

typedef struct Stu{
	char name[20];
	int cno;
}Stu;
Stu stu1; 
memset(&stu1, 0 ,sizeof(Stu));

Stu stu2[10]; //數(shù)組
memset(stu2, 0, sizeof(Stu)*10);

此外,如果結(jié)構(gòu)體中有數(shù)組的話還是需要對數(shù)組單獨(dú)進(jìn)行初始化處理的。

總結(jié)

  memset函數(shù)在初始化處理時非常方便,但也有其局限性,比如要注意初始化數(shù)值,要注意字節(jié)數(shù)等等。當(dāng)然,直接選擇用for循環(huán)或while循環(huán)來進(jìn)行初始化也是可以的,只不過memset更快捷一些。

到此這篇關(guān)于C++中的memset用法詳解的文章就介紹到這了,更多相關(guān)memset的用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解C++編程中運(yùn)算符的使用

    詳解C++編程中運(yùn)算符的使用

    這篇文章主要介紹了詳解C++編程中運(yùn)算符的使用,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C++計算每個字符出現(xiàn)的次數(shù)

    C++計算每個字符出現(xiàn)的次數(shù)

    這篇文章主要介紹了C++計算每個字符出現(xiàn)的次數(shù)的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • C語言程序如何求學(xué)生總成績和平均成績

    C語言程序如何求學(xué)生總成績和平均成績

    這篇文章主要介紹了C語言程序如何求學(xué)生總成績和平均成績,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 巧妙使用RAII中的ScopeExit

    巧妙使用RAII中的ScopeExit

    Resource Acquisition Is Initialization,資源獲取即初始化,將資源的生命周期與一個對象的生命周期綁定,這篇文章主要介紹了巧妙使用RAII中的ScopeExit,需要的朋友可以參考下
    2021-05-05
  • C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例

    C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例

    這篇文章主要介紹了C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例,其中TCP的客戶端與服務(wù)器端采用多線程實現(xiàn),需要的朋友可以參考下
    2016-03-03
  • C++實現(xiàn)屏幕截圖(全屏截圖)

    C++實現(xiàn)屏幕截圖(全屏截圖)

    屏幕截圖已經(jīng)成為了所有IM即時通訊軟件的必備模塊,也是日常辦公中使用最頻繁的功能之一。今天我們從C++開發(fā)的角度,來看看屏幕截圖的主要功能點(diǎn)是如何實現(xiàn)的,感興趣的可以了解一下
    2021-11-11
  • 《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)整理

    《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)整理

    在本篇文章里小編給大家整理的是關(guān)于《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)筆記內(nèi)容,需要的朋友們參考下。
    2020-02-02
  • C語言位運(yùn)算符:與、或、異或、取反、左移與右移詳細(xì)介紹

    C語言位運(yùn)算符:與、或、異或、取反、左移與右移詳細(xì)介紹

    以下是對C語言中的位運(yùn)算符:與、或、異或、取反、左移與右移進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • C語言深入分析遞歸函數(shù)的實現(xiàn)

    C語言深入分析遞歸函數(shù)的實現(xiàn)

    遞歸(recursive)函數(shù)是“自己調(diào)用自己”的函數(shù),無論是采用直接或間接調(diào)用方式。間接遞歸意味著函數(shù)調(diào)用另一個函數(shù)(然后可能又調(diào)用第三個函數(shù)等),最后又調(diào)用第一個函數(shù)。因為函數(shù)不可以一直不停地調(diào)用自己,所以遞歸函數(shù)一定具備結(jié)束條件
    2022-04-04
  • C語言之函數(shù)遞歸的實現(xiàn)

    C語言之函數(shù)遞歸的實現(xiàn)

    本文主要介紹了C語言之函數(shù)遞歸的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評論