memset函数及其用法,C语言memset函数详解
在前面不止一次說(shuō)過(guò),定義變量時(shí)一定要進(jìn)行初始化,尤其是數(shù)組和結(jié)構(gòu)體這種占用內(nèi)存大的數(shù)據(jù)結(jié)構(gòu)。在使用數(shù)組的時(shí)候經(jīng)常因?yàn)闆]有初始化而產(chǎn)生“燙燙燙燙燙燙”這樣的野值,俗稱“亂碼”。
每種類型的變量都有各自的初始化方法,memset() 函數(shù)可以說(shuō)是初始化內(nèi)存的“萬(wàn)能函數(shù)”,通常為新申請(qǐng)的內(nèi)存進(jìn)行初始化工作。它是直接操作內(nèi)存空間,mem即“內(nèi)存”(memory)的意思。該函數(shù)的原型為:
# include <string.h> void *memset(void *s, int c, unsigned long n);函數(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ù)的初始化為原始初始化,無(wú)法將變量初始化為程序中需要的數(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 是對(duì)較大的數(shù)組或結(jié)構(gòu)體進(jìn)行清零初始化的最快方法,因?yàn)樗侵苯訉?duì)內(nèi)存進(jìn)行操作的。
這時(shí)有人會(huì)問(wèn):“字符串?dāng)?shù)組不是最好用’\0’進(jìn)行初始化嗎?那么可以用 memset 給字符串?dāng)?shù)組進(jìn)行初始化嗎?也就是說(shuō)參數(shù) c 可以賦值為’\0’嗎?”
可以的。雖然參數(shù) c 要求是一個(gè)整數(shù),但是整型和字符型是互通的。但是賦值為 ‘\0’ 和 0 是等價(jià)的,因?yàn)樽址?‘\0’ 在內(nèi)存中就是 0。所以在 memset 中初始化為 0 也具有結(jié)束標(biāo)志符 ‘\0’ 的作用,所以通常我們就寫“0”。
memset 函數(shù)的第三個(gè)參數(shù) n 的值一般用 sizeof() 獲取,這樣比較專業(yè)。注意,如果是對(duì)指針變量所指向的內(nèi)存單元進(jìn)行清零初始化,那么一定要先對(duì)這個(gè)指針變量進(jìn)行初始化,即一定要先讓它指向某個(gè)有效的地址。而且用memset給指針變量如p所指向的內(nèi)存單元進(jìn)行初始化時(shí),n 千萬(wàn)別寫成 sizeof§,這是新手經(jīng)常會(huì)犯的錯(cuò)誤。因?yàn)?p 是指針變量,不管 p 指向什么類型的變量,sizeof§ 的值都是 4。
下面寫一個(gè)程序:
# include <stdio.h> # include <string.h> int main(void) {int i; //循環(huán)變量char str[10];char *p = str;memset(str, 0, sizeof(str)); //只能寫sizeof(str), 不能寫sizeof(p)for (i=0; i<10; ++i){printf("%d\x20", str[i]);}printf("\n");return 0; }根據(jù)memset函數(shù)的不同,輸出結(jié)果也不同,分為以下幾種情況:
memset(p, 0, sizeof§); //地址的大小都是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
轉(zhuǎn)載自:http://c.biancheng.net/view/231.html
總結(jié)
以上是生活随笔為你收集整理的memset函数及其用法,C语言memset函数详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《滚动数组》---滚动数组思想,运用在动
- 下一篇: LTE物理层过程