第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

memcpy()vs memmove()

memcpy()vs memmove()

C
慕蓋茨4494581 2019-10-05 14:32:01
我想了解的區(qū)別memcpy()和memmove(),和我讀的文本memcpy(),而沒有照顧重疊源和目的地memmove()一樣。但是,當我在重疊的存儲塊上執(zhí)行這兩個功能時,它們都給出相同的結果。例如,在memmove()幫助頁面上采用以下MSDN示例:-有沒有更好的例子來了解它的缺點memcpy以及如何memmove解決?// crt_memcpy.c// Illustrate overlapping copy: memmove always handles it correctly; memcpy may handle// it correctly.#include <memory.h>#include <string.h>#include <stdio.h>char str1[7] = "aabbcc";int main( void ){    printf( "The string: %s\n", str1 );    memcpy( str1 + 2, str1, 4 );    printf( "New string: %s\n", str1 );    strcpy_s( str1, sizeof(str1), "aabbcc" );   // reset string    printf( "The string: %s\n", str1 );    memmove( str1 + 2, str1, 4 );    printf( "New string: %s\n", str1 );}輸出:The string: aabbccNew string: aaaabbThe string: aabbccNew string: aaaabb
查看完整描述

3 回答

?
MMMHUHU

TA貢獻1834條經(jīng)驗 獲得超8個贊

對于您的示例沒有任何奇怪的行為,我并不感到完全驚訝。嘗試復制str1到str1+2,然后看看會發(fā)生什么。(實際上可能沒有什么不同,取決于編譯器/庫。)


通常,memcpy以簡單(但快速)的方式實現(xiàn)。簡單地說,它只是按順序循環(huán)數(shù)據(jù),從一個位置復制到另一個位置。這可能會導致在讀取源時將其覆蓋。


Memmove會做更多的工作來確保正確處理重疊。


編輯:


(不幸的是,我找不到合適的例子,但是這些都可以)。對比此處顯示的memcpy和memmove實現(xiàn)。memcpy只是循環(huán),而memmove執(zhí)行測試以確定循環(huán)方向,以免破壞數(shù)據(jù)。這些實現(xiàn)非常簡單。大多數(shù)高性能的實現(xiàn)更為復雜(涉及一次復制字大小的塊而不是字節(jié))。


查看完整回答
反對 回復 2019-10-05
?
慕的地8271018

TA貢獻1796條經(jīng)驗 獲得超4個贊

中的內存memcpy 不能重疊,否則您可能會面臨不確定的行為,而其中的內存memmove可能會重疊。


char a[16];

char b[16];


memcpy(a,b,16);           // valid

memmove(a,b,16);          // Also valid, but slower than memcpy.

memcpy(&a[0], &a[1],10);  // Not valid since it overlaps.

memmove(&a[0], &a[1],10); // valid. 

memcpy的某些實現(xiàn)可能仍適用于重疊的輸入,但是您不能指望這種行為。雖然記憶必須允許重疊。


查看完整回答
反對 回復 2019-10-05
  • 3 回答
  • 0 關注
  • 624 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號