国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

詳解C語言中的memset()函數

2020-01-26 14:57:13
字體:
來源:轉載
供稿:網友

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;}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 眉山市| 新疆| 昆山市| 尼勒克县| 兴海县| 凤凰县| 株洲市| 柳林县| 扶余县| 和田市| 鄱阳县| 绩溪县| 镇赉县| 遵化市| 丹凤县| 梁山县| 江源县| 台湾省| 嘉善县| 丁青县| 科技| 贺州市| 西畴县| 资溪县| 行唐县| 宜昌市| 聂拉木县| 海盐县| 读书| 斗六市| 普陀区| 榆林市| 阳谷县| 北流市| 林州市| 保定市| 平果县| 万载县| 阿坝| 子长县| 惠东县|