程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳解C說話中的memset()函數

詳解C說話中的memset()函數

編輯:關於C++

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved