memcpy 与 strcpy

本文详细解析memcpy()函数的用法,通过实际代码示例展示如何正确使用memcpy()进行内存拷贝操作,避免常见错误,并与strcpy()进行对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

memcpy() :拷贝内存内容

       定义函数:void *memcpy(void *dest,const void*src,size_t n);

        函数说明:memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上,与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束符‘\0’而结束.

        今天做了一件自己感觉面子上过不去的蠢事,虽然头人家也没批你,但被头指出这不该犯的错误就很不是滋味.所以还是做个记录,用来以后提醒自己呗.

         先把这错误的代码先写写吧

                意图:想把0x00,0x00,0x01,0xf0,0x0e,0x02,0x80,0x02这八个字节插入固定内存内容前面。

               错误代码:

                                int  nbyte = audioByte + 8;

                                char  buffer[nbyte] ;

                                int  nbytes[8]  = {0x00,0x00,0x01,0xf0,0x0e,0x02,0x80,0x02};

                                memcpy(buffer,nbytes,8);

                                memcpy(buffer+8,audioBuffer,audioByte);

                                结果是:在固定内存内容前面插入的是0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00.

                                错误原因在于nbytes类型为int, int 为四个字节,因把int改为unsigned char .

              改正代码:

                                

                                int  nbyte = audioByte + 8;

                                unsigned char  buffer[nbyte] ;

                                unsigned char  nbytes[8]  = {0x00,0x00,0x01,0xf0,0x0e,0x02,0x80,0x02};

                                memcpy(buffer,nbytes,8);

                                memcpy(buffer+8,audioBuffer,audioByte);

 

memcpy()与strcpy()区别:

         与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束符‘\0’而结束。

         例如:

                   #include<string.h>

                   #include<stdio.h>

                   int main(void)

                   {

                          char a[30] = "string(a)";

                          char b[30] = "hi\0zhangfulin";

                          int i;

                          strcpy(a,b);

                          printf("strcpy():");

                          printf("%s",a);

                          memcpy(a,b,30);

                          printf("\nmemcpy():");

                          printf("%s",a);

                          printf("\n i = %d\n",i);

                    }

                    结果:strcpy():hizhangfu

                              memcpy():hizhangfulin

                              i = 30

          

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值