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