五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

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

2022-10-20 15:53 作者:C語言編程__Plus  | 我要投稿



memset函數(shù)

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

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

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

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

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

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

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

當(dāng)然,數(shù)組也可以直接進行初始化,但 memset 是對較大的數(shù)組或結(jié)構(gòu)體進行清零初始化的最快方法,因為它是直接對內(nèi)存進行操作的。

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

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

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

根據(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表示的是一個字符變量, 只有一字節(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ù)

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

函數(shù)原型:

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

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

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

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

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

希望對你有幫助!

作者:Mr_Li_

另外的話為了幫助大家,輕松,高效學(xué)習(xí)C語言/C++,我給大家分享我收集的資源,從最零基礎(chǔ)開始的教程到C語言項目案例,幫助大家在學(xué)習(xí)C語言的道路上披荊斬棘!可以來我粉絲群領(lǐng)取哦~

微信公眾號:C語言編程學(xué)習(xí)基地

整理分享(多年學(xué)習(xí)的源碼、項目實戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)最重要的是你可以在群里面交流提問編程問題哦!

編程學(xué)習(xí)書籍分享:


【零基礎(chǔ)學(xué)C語言】內(nèi)存知識總結(jié):memset函數(shù)和calloc函數(shù)的評論 (共 條)

分享到微博請遵守國家法律
青冈县| 通渭县| 彰化县| 阳高县| 林芝县| 浦北县| 万全县| 平武县| 凭祥市| 蒙阴县| 建始县| 邹城市| 华容县| 武冈市| 泸溪县| 云和县| 阜宁县| 隆德县| 静宁县| 莱阳市| 乌拉特前旗| 洪湖市| 华蓥市| 北京市| 龙游县| 嵊州市| 正定县| 永寿县| 望都县| 商河县| 萍乡市| 哈巴河县| 天门市| 卢龙县| 罗田县| 凤山市| 海门市| 玉龙| 云林县| 红河县| 海盐县|