a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > 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;}

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

圖片精選

主站蜘蛛池模板: 久草天堂 | 国产精品成人一区二区三区夜夜夜 | 日本免费不卡 | 亚洲天堂在线视频观看 | 久久精品国产一区 | 黑色丝袜脚足j国产在线看68 | 亚洲第一成年免费网站 | 久久视频一区 | 日本一区二区三区视频在线观看 | 91久久久久 | 开心春色激情网 | a在线播放 | 99视频网站 | 一区二区三区免费视频网站 | 日本不卡一二三 | 国产精品久久久久久久久福交 | 日韩欧美网 | 开心激情站 | 婷婷激情五月 | 一区二区三区在线播放 | 国产精品久久久久久中文字 | 国产精品久久久久久久久久 | 自拍偷拍视频网站 | 精品色区 | 国产精品欧美久久久久一区二区 | 国产区 在线观看 | 青青草久 | 日韩一区二区精品视频 | 婷婷视频在线 | 国产探花在线精品一区二区 | 国产午夜精品久久久久久久 | 久久亚洲婷婷 | 小草av| 黄色大片免费网站 | 激情av| 欧美一区在线看 | 成人一级网站 | 久久国内精品 | 日韩成人一区 | 国产传媒一区 | 一区二区在线看 |