色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

memset函數和calloc函數

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 作者:Mr_Li_ ? 2022-10-20 16:13 ? 次閱讀

memset函數

memset(翻譯:清零)是計算機中C/C++語言初始化函數。作用是將某一塊內存中的內容全部設置為指定的值, 這個函數通常為新申請的內存做初始化工作。

以前說過,定義變量時一定要進行初始化,尤其是數組和結構體這種占用內存大的數據結構。在使用數組的時候經常因為沒有初始化而產生“燙燙燙燙燙燙”這樣的野值,俗稱“亂碼”。

每種類型的變量都有各自的初始化方法,memset() 函數可以說是初始化內存的“萬能函數”,通常為新申請的內存進行初始化工作。它是直接操作內存空間,mem即“內存”(memory)的意思。

該函數的原型為:

## include 
void *memset(void *s, int c, unsigned long n);
將s中當前位置后面的n個字節 (typedef unsigned int size_t )用 c 替換并返回 s

函數的功能是:將指針變量 s 所指向的前 n 字節的內存單元用一個“整數” c 替換,注意 c 是 int 型。s 是 void* 型的指針變量,所以它可以為任何類型的數據進行初始化。

memset() 的作用是在一段內存塊中填充某個給定的值。因為它只能填充一個值,所以該函數的初始化為原始初始化,無法將變量初始化為程序中需要的數據。用memset初始化完后,后面程序中再向該內存空間中存放需要的數據。

memset 一般使用“0”初始化內存單元,而且通常是給數組或結構體進行初始化。一般的變量如 char、int、float、double 等類型的變量直接初始化即可,沒有必要用 memset。如果用 memset 的話反而顯得麻煩。

當然,數組也可以直接進行初始化,但 memset 是對較大的數組或結構體進行清零初始化的最快方法,因為它是直接對內存進行操作的。

這時有人會問:“字符串數組不是最好用''進行初始化嗎?那么可以用 memset 給字符串數組進行初始化嗎?也就是說參數 c 可以賦值為''嗎?”

可以的。雖然參數 c 要求是一個整數,但是整型和字符型是互通的。但是賦值為 '' 和 0 是等價的,因為字符 '' 在內存中就是 0。所以在 memset 中初始化為 0 也具有結束標志符 '' 的作用,所以通常我們就寫“0”。

memset 函數的第三個參數 n 的值一般用 sizeof() 獲取,這樣比較專業。注意,如果是對指針變量所指向的內存單元進行清零初始化,那么一定要先對這個指針變量進行初始化,即一定要先讓它指向某個有效的地址。而且用memset給指針變量如p所指向的內存單元進行初始化時,n 千萬別寫成 sizeof(p),這是新手經常會犯的錯誤。因為 p 是指針變量,不管 p 指向什么類型的變量,sizeof(p) 的值都是 4。 (網上找別人的)

#include
#include
int main(void) {
  int i;
  char str[10];
  char *p = str;


  memset(str, 1, sizeof(str));//參數1就是變量名,中間的1就是指定要初始化的值(可以是任意的值包括字符和浮點數)
            //最后那個初始化是長度  (可以是填數字,但沒必要)          
  for (i = 0; i < 10; i++) {


    printf("%d	", str[i]);
  }


  return 0;


}

根據memset函數的不同,輸出結果也不同,分為以下幾種情況:

memset(p, 0, sizeof(p)); //地址的大小都是4字節

0 0 0 0 -52 -52 -52 -52 -52 -52

memset(p, 0, sizeof(p)); //p表示的是一個字符變量, 只有一字節

0 -52 -52 -52 -52 -52 -52 -52 -52 -52

memset(p, 0, sizeof(str));

0 0 0 0 0 0 0 0 0 0

memset(str, 0, sizeof(str));

0 0 0 0 0 0 0 0 0 0

memset(p, 0, 10); //直接寫10也行, 但不專業

0 0 0 0 0 0 0 0 0 0

calloc函數

有時候,我們在程序中需要一段內存來處理數據,但是又不確定是要多大內存的情況下,比如 我們申請一個數組 a[100] 但是事前我們并不知道會不會用得完這100個元素,比如我們只會用到10個,那么剩下的90個就會還在占用空間,就顯得很浪費空間,這時候使用calloc函數是用來在內存的動態存儲區中(堆中)分配一個連續存儲空間

函數原型:

void* callocunsigned int num,unsigned int size)
在內存的動態存儲區中分配num個長度為size的連續空間
num:對象個數,size:對象占據的內存字節數,相較于malloc函數,calloc函數會自動將內存初始化為0

calloc在動態分配完內存后,自動初始化該內存空間為零,而malloc不做初始化,分配到的空間中的數據是隨機數據。

注意:size僅僅為申請內存字節大小,與申請內存塊中存儲的數據類型無關,故編程時建議通過以下方式給出,"長度 * sizeof(數據類型)";并不需要人為的計算空間的大小,比如如果他要申請20個int類型空間,就可以int *p = (int *)calloc(20, sizeof(int))這樣就省去了人為空間計算的麻煩。

函數返回值:calloc函數返回一個指向分配起始地址的指針;如果分配不成功,返回NULL。

#include
int main(void) {
  int *p = (int *)calloc(10, sizeof(int));
  int i;


  printf("申請得的空間有:
");
  for (i = 0; i < 10; i++) {
    printf("%d ", *p++);
  }


  return 0;
}


結果:
0 0 0 0 0 0 0 0 0 0
//可以看到,使用calloc函數分配時,它最自動賦值零,而下面要介紹的malloc函數則不會

那么會有人有疑問:既然calloc不需要計算空間并且可以直接初始化內存避免錯誤,那為什么不直接使用calloc函數,那要malloc要什么用呢?

實際上,任何事物都有兩面性,有好的一面,必然存在不好的地方。這就是效率。calloc函數由于給每一個空間都要初始化值,那必然效率較malloc要低,并且現實世界,很多情況的空間申請是不需要初始值的,這也就是為什么許多初學者更多的接觸malloc函數的原因。

希望對你有幫助

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4345

    瀏覽量

    62890
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40200
  • 變量
    +關注

    關注

    0

    文章

    613

    瀏覽量

    28446

原文標題:【零基礎學C語言】內存知識總結:memset函數和calloc函數

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    SUMIF函數對比VLOOKUP的優勢

    在Excel中,數據管理和分析是日常工作中不可或缺的一部分。SUMIF函數和VLOOKUP函數是兩個非常受歡迎的函數,它們可以幫助用戶快速地處理和分析數據。盡管它們都可以用于查找和匯總數據,但它們在
    的頭像 發表于 11-11 09:16 ?415次閱讀

    SUMIF函數與SUMIFS函數的區別

    SUMIF函數和SUMIFS函數都是Excel中用于條件求和的函數,它們可以幫助用戶根據特定的條件對數據進行求和。盡管它們的基本功能相似,但在使用場景和功能上存在一些差異。以下是對這兩個函數
    的頭像 發表于 10-30 09:51 ?1499次閱讀

    SUMIF函數使用教程

    SUMIF函數是Excel中非常實用的函數之一,能夠根據指定條件對數據進行篩選和求和操作。以下是對SUMIF函數使用方法的詳細教程: 一、基本語法 SUMIF函數的基本語法為: =SU
    的頭像 發表于 10-30 09:50 ?618次閱讀

    如何由系統函數求頻率響應

    頻率響應函數表征了測試系統對給定頻率下的穩態輸出與輸入的關系,可以通過系統函數(或稱為傳遞函數)來求解。以下是由系統函數求頻率響應的步驟: 一、理解系統
    的頭像 發表于 10-18 09:32 ?1719次閱讀

    面試常考+1:函數指針與指針函數、數組指針與指針數組

    在嵌入式開發領域,函數指針、指針函數、數組指針和指針數組是一些非常重要但又容易混淆的概念。理解它們的特性和應用場景,對于提升嵌入式程序的效率和質量至關重要。一、指針函數函數指針指針
    的頭像 發表于 08-10 08:11 ?978次閱讀
    面試常考+1:<b class='flag-5'>函數</b>指針與指針<b class='flag-5'>函數</b>、數組指針與指針數組

    用malloc和calloc功能來實現DAQ,在調試模式下調用calloc和malloc函數時似乎卡住了,為什么?

    我正在使用 malloc 和 calloc 功能來實現 DAQ。 我使用的是 TLE9893 系列芯片。 代碼編譯良好,但在調試模式下調用 calloc 和 malloc 函數時似乎卡住了。 我嘗試
    發表于 05-27 08:29

    PHP用戶定義函數詳細講解

    描述 在所有編程和腳本語言中,函數是可以在程序中重復使用的語句塊。在 PHP 中,函數的概念與另一種語言(如“C”)中的概念相同。標準 PHP 發行版中有 1,000 多個內置函數。除此之外,我們
    的頭像 發表于 03-20 14:27 ?439次閱讀

    回調函數(callback)是什么?回調函數的實現方法

    回調函數是一種特殊的函數,它作為參數傳遞給另一個函數,并在被調用函數執行完畢后被調用。回調函數通常用于事件處理、異步編程和處理各種操作系統和
    發表于 03-12 11:46 ?3115次閱讀

    淺談C語言中的函數定義

    如果函數要使用參數,則必須聲明接受參數值的變量。這些變量稱為函數的形式參數。 形式參數就像函數內的其他局部變量,在進入函數時被創建,退出函數
    發表于 03-11 10:09 ?431次閱讀

    函數指針與回調函數的應用實例

    通常我們說的指針變量是指向一個整型、字符型或數組等變量,而函數指針是指向函數函數指針可以像一般函數一樣,用于調用函數、傳遞參數。
    的頭像 發表于 03-07 11:13 ?427次閱讀
    <b class='flag-5'>函數</b>指針與回調<b class='flag-5'>函數</b>的應用實例

    output函數怎么用

    output 函數是一個通用的術語,并不特指某個具體的編程語言或軟件工具。 如果你在使用 Python 編程語言,那么可能是指 print 函數。Python 中的 print 函數用于將指定的內容
    的頭像 發表于 02-23 14:21 ?1318次閱讀

    verilog function函數的用法

    Verilog 是一種硬件描述語言 (HDL),主要用于描述數字電子電路的行為和結構。在 Verilog 中,函數 (Function) 是一種用于執行特定任務并返回一個值的可重用代碼塊。函數
    的頭像 發表于 02-22 15:49 ?6002次閱讀

    內聯函數定義 為什么需要內聯函數

    inline關鍵字是C99標準的型關鍵字,其作用是將函數展開,把函數的代碼復制到每一個調用處。
    的頭像 發表于 02-19 12:20 ?576次閱讀

    verilog中函數和任務對比

    在verilog中,函數和任務均用來描述共同的代碼段,并且在模式內任意位置被調用,提高代碼效率,讓代碼更加的直觀,提高代碼可讀性。但是在實際使用的過程中,函數和任務也存在諸多的不同,下面將對而這進行
    的頭像 發表于 02-12 18:43 ?910次閱讀

    傳遞函數的定義是什么 傳遞函數的拉氏反變換是什么響應

    傳遞函數的定義: 傳遞函數是一種數學工具,用于描述線性時不變系統(LTI系統)的輸入與輸出之間的關系,通常用H(s)表示。傳遞函數是Laplace變換的函數,其中s是復變量。傳遞
    的頭像 發表于 02-01 10:53 ?4824次閱讀
    主站蜘蛛池模板: 欧美特级特黄a大片免费 | 美国特级成人毛片 | 亚洲高清中文字幕免费 | 亚洲中久无码永久在线 | 国产精品久久国产三级国不卡顿 | 久久AAAA片一区二区 | 伧理片午夜伧理片 | 亚洲AV久久婷婷蜜臀无码不卡 | 青柠在线观看免费高清电视剧荣耀 | 日韩欧美中文字幕在线 | www亚洲欲色成人久久精品 | 爱人 qvod| 国产午夜精品久久理论片 | 永久午夜福利视频一区在线观看 | 99国产精品欲AV蜜桃臀麻豆 | 久久re这里视频只精品首页 | 18日本人XXXXXX18 | 黄小飞二人转 | 69人体阴展网 | 久9视频这里只有精品123 | 精品免费在线视频 | 少妇第一次交换 | 亚洲国产在线精品国偷产拍 | 有码在线播放 | 美女内射视频WWW网站午夜 | 亚洲国产剧情中文视频在线 | 亚洲不卡视频在线观看 | AV天堂AV亚洲啪啪久久无码 | 香蕉人人超人人超碰超国产 | 久久免费精彩视频 | 久久久无码AV精品亚洲A片软件 | 91免费永久在线地址 | 东京热百度影音 | 国产亚洲精品久久综合阿香蕉 | 秘密影院久久综合亚洲综合 | 色多多旧版污污破解版 | 伊人色综合久久大香 | 一边亲着一面膜下奶韩剧免费 | 人妻无码AV中文系列 | 久久精品九九亚洲精品天堂 | 初中XXXXXL|