詳解C說話中的memset()函數。本站提示廣大學習愛好者:(詳解C說話中的memset()函數)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C說話中的memset()函數正文
C說話memset()函數:將內存的前n個字節設置為特定的值
頭文件:
#include <string.h>
memset() 函數用來將指定內存的前n個字節設置為特定的值,其原型為:
void * memset( void * ptr, int value, size_t num );
參數解釋:
ptr 為要操作的內存的指針。
value 為要設置的值。你既可以向 value 傳遞 int 類型的值,也能夠傳遞 char 類型的值,int 和 char 可以依據 ASCII 碼互相轉換。
num 為 ptr 的前 num 個字節,size_t 就是unsigned int。
【函數解釋】memset() 會將 ptr 所指的內存區域的前 num 個字節的值都設置為 value,然後前往指向 ptr 的指針。
memset() 可以將一段內存空間全體設置為特定的值,所以常常用來初始化字符數組。例如:
char str[20]; memset(str, '\0', sizeof(str)-1);
【前往值】前往指向 ptr 的指針。
留意:參數 value 雖聲明為 int,但必需是 unsigned char,所以規模在0 到255 之間。
典范:
復制純文本新窗口
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { // 弗成以聲明為 char *str = "http://c.biancheng.net"; char str[] = "http://c.biancheng.net"; memset(str, '-', 7); puts(str); system("pause"); return EXIT_SUCCESS; }
履行成果:
-------c.biancheng.net
memmove 和 memcpy的差別
memcpy和memmove()都是C說話中的庫函數,在頭文件string.h中,感化是拷貝必定長度的內存的內容,原型分離以下:
void *memcpy(void *dst, const void *src, size_t count); void *memmove(void *dst, const void *src, size_t count);
他們的感化是一樣的,獨一的差別是,當內存產生部分堆疊的時刻,memmove包管拷貝的成果是准確的,memcpy不包管拷貝的成果的准確。
第一種情形下,拷貝堆疊的區域不會湧現成績,內容都可以准確的被拷貝。
第二種情形下,成績湧現在左邊的兩個字節,這兩個字節的本來的內容起首就被籠罩了,並且沒有保留。所以接上去拷貝的時刻,拷貝的是曾經被籠罩的內容,明顯這是有成績的。
現實上,memcpy只是memmove的一個子集。
兩者的c說話完成很簡略,有興致的同伙可以去看看。在現實情形下,這兩個函數都是用匯編完成的。
memmove在copy兩個有堆疊區域的內存時可以包管copy的准確,而memcopy就不可了,但memcopy比memmove的速度要快一些,如:
char s[] = "1234567890";
char* p1 = s;
char* p2 = s+2;
memcpy(p2, p1, 5)與memmove(p2, p1, 5)的成果便可能是分歧的,memmove()可以將p1的頭5個字符"12345"准確拷貝至p2,而memcpy()的成果就紛歧定准確了
memcpy()、 memmove()和memccpy()
這三個函數的功效均是將某個內存塊復制到另外一個內存塊。前兩個函數的差別在於它們處置內存區域堆疊(overlapping)的方法分歧。第三個函數的功效也是復制內存,然則假如碰到某個特定值時立刻停滯復制。
關於庫函數來講,因為沒有方法曉得傳遞給他的內存區域的情形,所以應當應用memmove()函數。經由過程這個函數,可以包管不會湧現任何內存塊堆疊成績。而關於運用法式來講,由於代碼“曉得”兩個內存塊不會堆疊,所以可以平安地應用memcpy()函數。
關於memmove的完成:
void *mymemmove(void *dest, const void *src, size_t n) { char temp[n]; int i; char *d = dest; const char *s = src; for (i = 0; i < n; i++) temp[i] = s[i]; for (i = 0; i < n; i++) d[i] = temp[i]; return dest; }
關於memcpy的完成:
void *mymemcpy(void *dest, const void *src, size_t n) { char *d = dest; const char *s = src; int *di; const int *si; int r = n % 4; while (r--) *d++ = *s++; di = (int *)d; si = (const int*)s; n /= 4; while (n--) *di++ = *si++; return dest; }