91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

memset函數(shù)和calloc函數(shù)

C語言編程學(xué)習(xí)基地 ? 來源:C語言編程學(xué)習(xí)基地 ? 作者:Mr_Li_ ? 2022-10-20 16:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

memset函數(shù)

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

以前說過,定義變量時(shí)一定要進(jìn)行初始化,尤其是數(shù)組和結(jié)構(gòu)體這種占用內(nèi)存大的數(shù)據(jù)結(jié)構(gòu)。在使用數(shù)組的時(shí)候經(jīng)常因?yàn)闆]有初始化而產(chǎn)生“燙燙燙燙燙燙”這樣的野值,俗稱“亂碼”。

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

該函數(shù)的原型為:

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

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

memset() 的作用是在一段內(nèi)存塊中填充某個(gè)給定的值。因?yàn)樗荒芴畛湟粋€(gè)值,所以該函數(shù)的初始化為原始初始化,無法將變量初始化為程序中需要的數(shù)據(jù)。用memset初始化完后,后面程序中再向該內(nèi)存空間中存放需要的數(shù)據(jù)。

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

當(dāng)然,數(shù)組也可以直接進(jìn)行初始化,但 memset 是對較大的數(shù)組或結(jié)構(gòu)體進(jìn)行清零初始化的最快方法,因?yàn)樗侵苯訉?nèi)存進(jìn)行操作的。

這時(shí)有人會問:“字符串?dāng)?shù)組不是最好用''進(jìn)行初始化嗎?那么可以用 memset 給字符串?dāng)?shù)組進(jìn)行初始化嗎?也就是說參數(shù) c 可以賦值為''嗎?”

可以的。雖然參數(shù) c 要求是一個(gè)整數(shù),但是整型和字符型是互通的。但是賦值為 '' 和 0 是等價(jià)的,因?yàn)樽址?'' 在內(nèi)存中就是 0。所以在 memset 中初始化為 0 也具有結(jié)束標(biāo)志符 '' 的作用,所以通常我們就寫“0”。

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

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


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


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


  return 0;


}

根據(jù)memset函數(shù)的不同,輸出結(jié)果也不同,分為以下幾種情況:

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

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

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

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也行, 但不專業(yè)

0 0 0 0 0 0 0 0 0 0

calloc函數(shù)

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

函數(shù)原型:

void* callocunsigned int num,unsigned int size)
在內(nèi)存的動(dòng)態(tài)存儲區(qū)中分配num個(gè)長度為size的連續(xù)空間
num:對象個(gè)數(shù),size:對象占據(jù)的內(nèi)存字節(jié)數(shù),相較于malloc函數(shù),calloc函數(shù)會自動(dòng)將內(nèi)存初始化為0

calloc在動(dòng)態(tài)分配完內(nèi)存后,自動(dòng)初始化該內(nèi)存空間為零,而malloc不做初始化,分配到的空間中的數(shù)據(jù)是隨機(jī)數(shù)據(jù)。

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

函數(shù)返回值:calloc函數(shù)返回一個(gè)指向分配起始地址的指針;如果分配不成功,返回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;
}


結(jié)果:
0 0 0 0 0 0 0 0 0 0
//可以看到,使用calloc函數(shù)分配時(shí),它最自動(dòng)賦值零,而下面要介紹的malloc函數(shù)則不會

那么會有人有疑問:既然calloc不需要計(jì)算空間并且可以直接初始化內(nèi)存避免錯(cuò)誤,那為什么不直接使用calloc函數(shù),那要malloc要什么用呢?

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

希望對你有幫助!

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67521
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    41592
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    616

    瀏覽量

    29506

原文標(biāo)題:【零基礎(chǔ)學(xué)C語言】內(nèi)存知識總結(jié):memset函數(shù)和calloc函數(shù)

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式開發(fā)常用函數(shù)速查表

    在嵌入式開發(fā)中,掌握常用函數(shù)的用法可以大大提高開發(fā)效率。無論是單片機(jī)初學(xué)者還是有一定經(jīng)驗(yàn)的工程師,熟悉函數(shù)庫和調(diào)用方式都是必備技能。今天,我們?yōu)榇蠹艺硪环萸度胧介_發(fā)常用函數(shù)速查表,覆蓋GPIO
    的頭像 發(fā)表于 01-19 09:06 ?308次閱讀
    嵌入式開發(fā)常用<b class='flag-5'>函數(shù)</b>速查表

    西門子PLC中函數(shù)FC的使用方法

    函數(shù)函數(shù)塊作為模塊化編程的重要組成部分,在PLC 用戶程序中有著相當(dāng)頻繁的應(yīng)用。兩者在生成與使用的過程中都有一定的相似,且都不能單獨(dú)使用。而需要賦予特定的功能,由組織塊(OB)直接或者間接進(jìn)行調(diào)用。
    的頭像 發(fā)表于 12-19 11:26 ?4217次閱讀
    西門子PLC中<b class='flag-5'>函數(shù)</b>FC的使用方法

    如何用函數(shù)指針調(diào)用函數(shù)

    給大家舉一個(gè)例子: int Func(int x);/*聲明一個(gè)函數(shù)*/ int (*p) (int x);/*定義一個(gè)函數(shù)指針*/ p = Func; /*將Func函數(shù)的首地址賦給指針變量
    發(fā)表于 12-11 06:26

    LUA例程-常用的回調(diào)函數(shù)使用說明

    詳細(xì)說明LUA腳本函數(shù)功能和對應(yīng)的應(yīng)用實(shí)例。對于LUA腳本編程有很大的幫助和提高技能。
    發(fā)表于 11-24 16:43 ?0次下載

    使用函數(shù)塊實(shí)現(xiàn)三相電機(jī)正反轉(zhuǎn)控制

    在使用西門子S1200PLC,所使用的軟件是博途軟件,在這個(gè)軟件里運(yùn)用了塊的概念。比如我們常見的組織塊(OB)、函數(shù)塊(FB)、數(shù)據(jù)塊(DB)以及函數(shù)FC等。今天我們來具體交流一下這個(gè)函數(shù)塊(FB)的具體使用方法。
    的頭像 發(fā)表于 10-15 14:40 ?2719次閱讀
    使用<b class='flag-5'>函數(shù)</b>塊實(shí)現(xiàn)三相電機(jī)正反轉(zhuǎn)控制

    加載動(dòng)態(tài)模塊報(bào)錯(cuò),提示memset函數(shù)未找到,但是代碼沒用到memset,為什么?

    動(dòng)態(tài)模塊提示memset未找到,但是代碼沒用到memset。 報(bào)錯(cuò): Module: can’t find memset in kernel symbol table
    發(fā)表于 10-14 06:59

    大彩講堂:VisualHMI-LUA教程-set_bit/get_bit函數(shù)應(yīng)用

    set_bit/get_bit函數(shù)應(yīng)用
    的頭像 發(fā)表于 08-31 17:05 ?835次閱讀
    大彩講堂:VisualHMI-LUA教程-set_bit/get_bit<b class='flag-5'>函數(shù)</b>應(yīng)用

    大彩講堂:VisualHMI-LUA教程-on_update回調(diào)函數(shù)使用指南

    回調(diào)函數(shù)使用指南
    的頭像 發(fā)表于 08-31 16:25 ?874次閱讀
    大彩講堂:VisualHMI-LUA教程-on_update回調(diào)<b class='flag-5'>函數(shù)</b>使用指南

    詳解hal_entry入口函數(shù)

    當(dāng)使用RTOS時(shí),程序從main函數(shù)開始進(jìn)行線程調(diào)度;當(dāng)沒有使用RTOS時(shí),C語言程序的入口函數(shù)main函數(shù)調(diào)用了hal_entry函數(shù)。由于我們新建的工程是沒有選用RTOS的,因此,
    的頭像 發(fā)表于 07-25 15:34 ?1995次閱讀

    C語言中的內(nèi)聯(lián)函數(shù)與宏

    在C編程中,內(nèi)聯(lián)函數(shù)和宏都用于避免函數(shù)調(diào)用的開銷并編寫可復(fù)用的邏輯部分,但它們在工作方式和安全性方面存在顯著差異。
    的頭像 發(fā)表于 07-25 15:10 ?1916次閱讀
    C語言中的內(nèi)聯(lián)<b class='flag-5'>函數(shù)</b>與宏

    MSP430常用內(nèi)聯(lián)函數(shù)說明

    電子發(fā)燒友網(wǎng)站提供《MSP430常用內(nèi)聯(lián)函數(shù)說明.docx》資料免費(fèi)下載
    發(fā)表于 06-05 17:20 ?0次下載

    為什么不需要給回調(diào)函數(shù)傳遞參數(shù)

    回調(diào)函數(shù)是C語言里面一個(gè)重要機(jī)制。
    的頭像 發(fā)表于 04-15 10:11 ?844次閱讀

    函數(shù)指針的六個(gè)常見應(yīng)用場景

    函數(shù)指針在嵌入式開發(fā)中有著廣泛的應(yīng)用,它讓代碼更加靈活,減少冗余,提高可擴(kuò)展性。很多時(shí)候,我們需要根據(jù)不同的情況動(dòng)態(tài)調(diào)用不同的函數(shù),而函數(shù)指針正是實(shí)現(xiàn)這一需求的重要工具。本文將介紹六個(gè)常見的
    的頭像 發(fā)表于 04-07 11:58 ?1478次閱讀
    <b class='flag-5'>函數(shù)</b>指針的六個(gè)常見應(yīng)用場景

    詳解RTOS中的Hook函數(shù)

    Hook函數(shù)是RTOS中的一個(gè)關(guān)鍵特性,通過該函數(shù),用戶可以增強(qiáng)對任務(wù)管理的控制,定義系統(tǒng)行為。
    的頭像 發(fā)表于 03-24 16:14 ?1081次閱讀

    解鎖TSMaster fifo函數(shù):報(bào)文讀取的高效方法

    前言:TSMaster目前有兩種讀取報(bào)文的模式:回調(diào)函數(shù)模式和fifo模式。fifo函數(shù)是TSMaster近期新增的函數(shù),本文將重點(diǎn)介紹fifo模塊。關(guān)于回調(diào)函數(shù)的使用方法可以參考幫助
    的頭像 發(fā)表于 03-14 20:04 ?1153次閱讀
    解鎖TSMaster fifo<b class='flag-5'>函數(shù)</b>:報(bào)文讀取的高效方法