小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

strcpy,memcpy,memmove,memset,strncpy

 示且青春 2012-05-06

strcpy,memcpy,memmove,memset,strncpy,
一.函數(shù)分別介紹:
1、memcpy:
原型:extern void *memcpy(void *dest, const void *src, unsigned int count);
用法:#include<string.h>
功能:由src所指內(nèi)存區(qū)域復(fù)制count個(gè)字節(jié)到dest所指內(nèi)存區(qū)域。
說明:src和dest所指內(nèi)存區(qū)域不能重疊,函數(shù)返回指向dest的指針。
注意:和strcpy相比,memcpy不是遇到’\0’就結(jié)束,而是一定會(huì)拷貝完n個(gè)字節(jié)。

2、memset:
函數(shù)原型:
extern void *memset(void *s, int c, size_t n)
功能:將已開辟內(nèi)存空間s的首n個(gè)字節(jié)的值設(shè)為值c。將s中的前n個(gè)字符替換為c,并返回s。
memset常用于內(nèi)存空間的初始化。
memset的深刻內(nèi)涵:用來對(duì)一段內(nèi)科空間全部設(shè)置為某個(gè)字符,一般用在對(duì)定義的字符串進(jìn)行初始化為:memset(a, ‘\0’, sizeof(a));

3、void *memmove(void *s, const void *ct, size_t n)
與memcpy類似,所不同的是,當(dāng)對(duì)象重疊時(shí),該函數(shù)仍能正確執(zhí)行

4、strncpy(s, t, n)
把t指向的字符串中前n個(gè)字符復(fù)制到s指向的位置。

二.下面重點(diǎn)來講解memcpy和memmove的區(qū)別:
這兩個(gè)函數(shù)的函數(shù)原型(除了名字)是一樣的:
void *memcpy(void *dst, const void *src, size_t count):
void *memmove(void *dst, const void *src, size_t count);
它們都是從src所指向的內(nèi)存中復(fù)制count個(gè)字節(jié)到dst所指內(nèi)存中,并返回dst的值。當(dāng)源內(nèi)存區(qū)域和目標(biāo)內(nèi)存區(qū)域無交叉時(shí),兩者的結(jié)果都是一樣的。但有交叉時(shí)不一樣。源內(nèi)存和目標(biāo)內(nèi)存交叉的情況有以下兩種:(左邊為低地址)

1、


即:dst<=src 且 dst+count>src
2、


即:src<dst且src+count>dst
下面將針對(duì)這兩種情況來討論。針對(duì)第一種交叉情況情況,dst<src且dst+count>src,memcpy和memmove的結(jié)果是一樣的。請(qǐng)看下面的例子講解:
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
memcpy(a, a+4, sizeof(int)*6);和memmove(a, a+4, sizeof(int)*6);結(jié)果是:
4567896789

針對(duì)第二種情況,src<dst且src+count>dst,memcpy和memmove的結(jié)果是不一樣的。請(qǐng)看下面的例子:
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
memcpy(a+4, a, sizeof(int)*6)


memmove(a+4, a, sizeof(int)*6)



下面是這兩個(gè)函數(shù)的具體實(shí)現(xiàn):
void *memcpyMy(void *dst, const void *src, size_t count){
void *address = dst;

while (count)
{
   *(char *)address = *(char *)src;
   address = (char *)address + 1;
   src = (char *)src + 1;
   count --;
}

return dst;
}

void *memmoveMy(void *dst, const void *src, size_t count){
void *address = dst;

if (dst <= src || (char*)dst >= (char *)src + count)
{
   while (count --)
   {
    *(char *)address = *(char *)src;
    address = (char *)address + 1;
    src = (char *)src + 1;
   }
}else{
   address = (char *)address + count - 1;
   src = (char *)src + count - 1;
   while (count --)
   {
    *(char *)address = *(char *)src;
    address = (char *)address - 1;
    src = (char *)src - 1;
   }
}

return dst;
}
以上兩段代碼是在vc6.0下通過測(cè)試的。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多