2 回答

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
取決于編譯器memcpy實(shí)現(xiàn)的方式
一般有三種,從頭復(fù)制 從尾復(fù)制 或者判斷復(fù)制(等同于memmove)
仿照你的 我寫(xiě)了一個(gè)測(cè)試程序
char message2[60] = "abcdefghijklmnopqrstuvwxyz" ; char tmp[60]; int main() { strcpy (tmp, message2); printf ( "tmp= \"%s\"\n" , tmp); memcpy (tmp+4, tmp + 16, 10); printf ( "memcpy(tmp+4, tmp + 16, 10);> tmp = \"%s\"\n" , tmp); strcpy (tmp, message2); memcpy (tmp+6, tmp +4, 10); printf ( "memcpy(tmp+6, tmp +4, 10);> tmp = \"%s\"\n" , tmp); strcpy (tmp, message2); memcpy (tmp+4, tmp +6, 10); printf ( "memcpy(tmp+4, tmp +6, 10);> tmp = \"%s\"\n" , tmp); } |
測(cè)試結(jié)果如下
tmp= "abcdefghijklmnopqrstuvwxyz"
memcpy(tmp+4, tmp + 16, 10);> tmp = "abcdqrstuvwxyzopqrstuvwxyz"
memcpy(tmp+6, tmp +4, 10);> tmp = "abcdefefefijijmnqrstuvwxyz"
memcpy(tmp+4, tmp +6, 10);> tmp = "abcdghijklmnopopqrstuvwxyz"
可以看到 在memcpy(tmp+6, tmp +4, 10);時(shí)出現(xiàn)了覆蓋 efefef
說(shuō)明我的編譯器(gcc)在做memcpy的時(shí)候使用的是頭復(fù)制 即從起始地址開(kāi)始復(fù)制
如果這個(gè)不出錯(cuò) 而memcpy(tmp+4, tmp +6, 10);出錯(cuò) 那么就是尾復(fù)制
都不出錯(cuò)的話 那么就是判斷之后智能復(fù)制 相當(dāng)于memmove

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超5個(gè)贊
該例子說(shuō)明幾個(gè)問(wèn)題
1. mem開(kāi)頭的函數(shù)基本上都是對(duì)內(nèi)存操作的,
它們不管內(nèi)存里放的是什么數(shù)據(jù),只要給出長(zhǎng)度,它們就操作。
不像strcpy、strcmp等函數(shù)一定以'\0'結(jié)尾,而且是字符。
mem可以操作可見(jiàn)字符、不可見(jiàn)字符、控制字符等,任意數(shù)據(jù)都可以。
2. memcpy是內(nèi)存復(fù)制函數(shù)
原型:
void * memcpy(void *dest, void const *src, unsigned int length);
功能:從src的起始位置復(fù)制length個(gè)字節(jié)到dst的內(nèi)存起始位置。你可以用這種
方法復(fù)制任何類型的值,第3個(gè)參數(shù)指定復(fù)制值的長(zhǎng)度(以字節(jié)計(jì))。
如果src和dst以任何形式出現(xiàn)了重疊,它的結(jié)果是未定義的。
3. memset函數(shù)
原型:void * memset(void *a, int val, unsigned int length);
功能:把從a開(kāi)始的length個(gè)字節(jié)都設(shè)置為值val。
例子:memset(buffer, 0, SIZE);
添加回答
舉報(bào)