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

分享

memcpy/memset函數(shù)的c語言實(shí)現(xiàn)

 補(bǔ)丁牛仔褲 2023-03-23 發(fā)布于廣東

1、memcpy

頭文件:#include <string.h>

函數(shù)原型:void *memcpy(void *dest, const void *src, size_t n)

功能:將指針src指向的內(nèi)存空間的n個(gè)字節(jié)復(fù)制到dest指針指向的內(nèi)存空間

參數(shù):src 為原內(nèi)容內(nèi)存的起始地址,dest為復(fù)制到目標(biāo)地址的起始地址

返回值:目標(biāo)dest內(nèi)存的起始地址

注意:1、內(nèi)存空間不能夠有重疊;

   2、memcpy對(duì)于需要復(fù)制的內(nèi)容沒有限制,因此用途更廣;

      3、很明確的是memcpy是將 n個(gè)字節(jié),  雖然memcpy對(duì)復(fù)制的內(nèi)容完全沒有任何的限制,比如數(shù)組,結(jié)構(gòu)體等特殊的結(jié)構(gòu),如果你想將整個(gè)結(jié)構(gòu)體變量的內(nèi)容復(fù)制到dest內(nèi)存區(qū),最好使用sizeof將要復(fù)制的內(nèi)容的完整大小求出來賦值給n,以保持復(fù)制的完整性;

c代碼:

  1. void *memCpy(void *dest, const void *src, size_t n)
  2. {
  3. if (NULL == dest || NULL == src || n < 0)
  4. return NULL;
  5. char *tempDest = (char *)dest;
  6. char *tempSrc = (char *)src;
  7. while (n-- > 0)
  8. *tempDest++ = *tempSrc++;
  9. return dest;
  10. }

2、memset

頭文件:#include <string.h>

函數(shù)原型:void *memset(void *s, int c, size_t n)

功能:以s為起始位置的n個(gè)字節(jié)的內(nèi)存區(qū)域用整數(shù)c進(jìn)行填充

參數(shù):s為內(nèi)存區(qū)域的起始位置,c為要填充的字符,n為要填充多少個(gè)字節(jié)

返回值:目標(biāo)s內(nèi)存的起始地址

注意:1、n表示的是字節(jié)數(shù),函數(shù)是以字節(jié)的形式每次賦值給目標(biāo)地址;

      2、memset函數(shù)也是以字節(jié)為單位進(jìn)行賦值的,所以要想在整形數(shù)組中給每一位賦確定的非0值,一般來講是不可行的;(下方將有對(duì)此說明測(cè)試的程序)

c代碼:

  1. void *memSet(void *s, int c, size_t n)
  2. {
  3. if (NULL == s || n < 0)
  4. return NULL;
  5. char * tmpS = (char *)s;
  6. while(n-- > 0)
  7. *tmpS++ = c;
  8. return s;
  9. }

下面是針對(duì)注意事項(xiàng)的測(cè)試程序:
  1. #include <stdio.h>
  2. #include <string.h>
  3. void *memSet(void *s, int c, size_t n)
  4. {
  5. if (NULL == s || n < 0)
  6. return NULL;
  7. char * tmpS = (char *)s;
  8. while(n-- > 0)
  9. *tmpS++ = c;
  10. return s;
  11. }
  12. int main()
  13. {
  14. int buf[10];
  15. int i;
  16. printf('%d\n', sizeof buf);
  17. for (i = 0; i < 10; i++)
  18. printf('buf[%d] = %d\n', i, buf[i]);
  19. printf('------------------------------------\n');
  20. memSet(buf, 1, sizeof(buf));
  21. for (i = 0; i < 10; i++)
  22. printf('buf[%d] = %d\n', i, buf[i]);
  23. return 0;
  24. }

結(jié)果:


結(jié)果分析:可以看出得出的結(jié)果并沒有得到想要的1,而得出不知道是什么的東西;

1的二進(jìn)制表示是:0000 0000 0000 0000 0000 0000 0000 0001

memset函數(shù)也是以字節(jié)為單位進(jìn)行賦值的,指針每次只會(huì)向后移動(dòng)一個(gè)字節(jié),依此將值賦給每次的地址中,直到n = 0;

最后在四個(gè)字節(jié)中賦值的結(jié)果為:0000 0001 0000 0001 0000 0001 0000 0001 

十進(jìn)制顯示就為:16843009

當(dāng)把數(shù)組改成char buf[10]時(shí),顯示的結(jié)果如下:(更加證明是以字節(jié)方式賦值)


    本站是提供個(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)論公約

    類似文章 更多