欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C語(yǔ)言中的memset()函數(shù)

 更新時(shí)間:2015年08月26日 15:20:37   作者:But_Bueatiful  
這篇文章主要介紹了C語(yǔ)言中的memset()函數(shù),包括其與memcpy()函數(shù)的區(qū)別,需要的朋友可以參考下

C語(yǔ)言memset()函數(shù):將內(nèi)存的前n個(gè)字節(jié)設(shè)置為特定的值
頭文件:

#include <string.h>

memset() 函數(shù)用來(lái)將指定內(nèi)存的前n個(gè)字節(jié)設(shè)置為特定的值,其原型為:

  void * memset( void * ptr, int value, size_t num );

參數(shù)說(shuō)明:
ptr 為要操作的內(nèi)存的指針。
value 為要設(shè)置的值。你既可以向 value 傳遞 int 類型的值,也可以傳遞 char 類型的值,int 和 char 可以根據(jù) ASCII 碼相互轉(zhuǎn)換。
num 為 ptr 的前 num 個(gè)字節(jié),size_t 就是unsigned int。

【函數(shù)說(shuō)明】memset() 會(huì)將 ptr 所指的內(nèi)存區(qū)域的前 num 個(gè)字節(jié)的值都設(shè)置為 value,然后返回指向 ptr 的指針。

memset() 可以將一段內(nèi)存空間全部設(shè)置為特定的值,所以經(jīng)常用來(lái)初始化字符數(shù)組。例如:

char str[20];
memset(str, '\0', sizeof(str)-1);

【返回值】返回指向 ptr 的指針。

注意:參數(shù) value 雖聲明為 int,但必須是 unsigned char,所以范圍在0 到255 之間。

范例:
復(fù)制純文本新窗口

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

執(zhí)行結(jié)果:

-------c.biancheng.net

memmove 和 memcpy的區(qū)別
memcpy和memmove()都是C語(yǔ)言中的庫(kù)函數(shù),在頭文件string.h中,作用是拷貝一定長(zhǎng)度的內(nèi)存的內(nèi)容,原型分別如下:

void *memcpy(void *dst, const void *src, size_t count);

void *memmove(void *dst, const void *src, size_t count); 

他們的作用是一樣的,唯一的區(qū)別是,當(dāng)內(nèi)存發(fā)生局部重疊的時(shí)候,memmove保證拷貝的結(jié)果是正確的,memcpy不保證拷貝的結(jié)果的正確。

第一種情況下,拷貝重疊的區(qū)域不會(huì)出現(xiàn)問(wèn)題,內(nèi)容均可以正確的被拷貝。
第二種情況下,問(wèn)題出現(xiàn)在右邊的兩個(gè)字節(jié),這兩個(gè)字節(jié)的原來(lái)的內(nèi)容首先就被覆蓋了,而且沒(méi)有保存。所以接下來(lái)拷貝的時(shí)候,拷貝的是已經(jīng)被覆蓋的內(nèi)容,顯然這是有問(wèn)題的。
實(shí)際上,memcpy只是memmove的一個(gè)子集。

二者的c語(yǔ)言實(shí)現(xiàn)很簡(jiǎn)單,有興趣的朋友可以去看看。在實(shí)際情況下,這兩個(gè)函數(shù)都是用匯編實(shí)現(xiàn)的。

memmove在copy兩個(gè)有重疊區(qū)域的內(nèi)存時(shí)可以保證copy的正確,而memcopy就不行了,但memcopy比memmove的速度要快一些,如:
char s[] = "1234567890";
char* p1 = s;
char* p2 = s+2;
memcpy(p2, p1, 5)與memmove(p2, p1, 5)的結(jié)果就可能是不同的,memmove()可以將p1的頭5個(gè)字符"12345"正確拷貝至p2,而memcpy()的結(jié)果就不一定正確了

memcpy()、 memmove()和memccpy()

    這三個(gè)函數(shù)的功能均是將某個(gè)內(nèi)存塊復(fù)制到另一個(gè)內(nèi)存塊。前兩個(gè)函數(shù)的區(qū)別在于它們處理內(nèi)存區(qū)域重疊(overlapping)的方式不同。第三個(gè)函數(shù)的功能也是復(fù)制內(nèi)存,但是如果遇到某個(gè)特定值時(shí)立即停止復(fù)制。
    對(duì)于庫(kù)函數(shù)來(lái)說(shuō),由于沒(méi)有辦法知道傳遞給他的內(nèi)存區(qū)域的情況,所以應(yīng)該使用memmove()函數(shù)。通過(guò)這個(gè)函數(shù),可以保證不會(huì)出現(xiàn)任何內(nèi)存塊重疊問(wèn)題。而對(duì)于應(yīng)用程序來(lái)說(shuō),因?yàn)榇a“知道”兩個(gè)內(nèi)存塊不會(huì)重疊,所以可以安全地使用memcpy()函數(shù)。

關(guān)于memmove的實(shí)現(xiàn):

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

關(guān)于memcpy的實(shí)現(xiàn):

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

相關(guān)文章

最新評(píng)論