关于memcpy()的问题

来源:百度知道 编辑:UC知道 时间:2024/07/08 02:09:35
定义函数: void *memcpy(void *dest, const void *src, size_t n)
函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。
有个疑问,如果memcpy()调用2次,那么第二次拷贝的内容是追加的还是覆盖的?
=========================================
我用socket传文件,socket缓冲区是有大小限制的,假设缓冲区是1K,那么调用sockClient.Receive(data, 1M)也只能收到前1K数据。接收的时候用循环

......
int dataLength;// 要接收文件的长度
sockClient.Receive(&dataLength, 4);// 接收文件的长度信息
byte *data = new byte[dataLength];//存放接收的文件
....
while (1)
{
byte *t= new byte[0x1000];//循环一次接收的数据
int n = sockClient.Receive(t, 0x1000);
if (n == 0)
{
break; //接收完毕退出
}
memcpy(data, t, n);//把收到的数据写入data

}

这样为什么不行,哪里出问题?要怎么样把循环接收的所有数据都追加到data?
发送小的图片没问题,大的图片就出问题,如图,而且接收程序出错退出,什么原因呢?
给data分配的存储空间不够吗?现在data的大小已经是和发送的文件大小一致的了,奇怪了

void *memcpy(void *dest, const void *src, size_t n);
就是把以src指向地址为起始地址连续n个字节的数据复制到dest指向地址为起始地址连续n个字节的空间内。

如果连续调用memcpy但dest参数指向的地址不变的话,那当然就是覆盖数据了。
如果好追加数据,那么每次执行memcpy后要把dest的地址增加到你要追加数据的地址。

你的代码可以改为(请自己保证给data分配足够的存储空间):

int m=0;
while (1)
{
byte *t= new byte[0x1000];//循环一次接收的数据
int n = sockClient.Receive(t, 0x1000);
if (n == 0)
{
break; //接收完毕退出
}
memcpy(data+m*0x1000, t, n);//把收到的数据写入data
m++;
}

memcpy(data, t, n);//把收到的数据写入data
这行有问题,应该先定义一个接受长度变量:
int nHaveReceive = 0;(定义在while前)

下面再修改为:
memcpy(data+nHaveReceive, t, n);//把收到的数据写入data
nHaveReceive += n;
这样就可以了。

另外你定义了一个:
byte *t= new byte[0x1000];//循环一次接收的数据
来放置一次接受的字符串,t并没有释放,这样是很不规范的,也完全没有必要,我给你写个最简单的代码吧:

int dataLength;// 要接收文件的长度
sockClient.Receive(&dataLength, 4);// 接收文件的长度信息
byte *data = new byte[dataLength];//存放接收的文件
....