memcpy拷贝最大长度 拷贝内存有没有大小限制

关于memcpy()的问题_百度知道
关于memcpy()的问题
定义函数: void *memcpy(void *dest, const void *src, size_t n)
函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。
有个疑问,如果memcpy()调用2次,那么第二次拷贝的内容是追加的还是覆盖的?
==========================...
发送小的图片没问题,大的图片就出问题,如图,而且接收程序出错退出,什么原因呢?给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) {
//接收完毕退出 } memcpy(data+m*0x1000, t, n);//把收到的数据写入data m++;}
采纳率:55%
memcpy(data, t, n);//把收到的数据写入data 这行有问题,应该先定义一个接受长度变量:int nHaveReceive = 0;(定义在while前)下面再修改为:memcpy(data+nHaveReceive, t, n);//把收到的数据写入data nHaveReceive +=这样就可以了。另外你定义了一个:byte *t= new byte[0x1000];//循环一次接收的数据 来放置一次接受的字符串,t并没有释放,这样是很不规范的,也完全没有必要,我给你写个最简单的代码吧:int dataL// 要接收文件的长度 sockClient.Receive(&dataLength, 4);// 接收文件的长度信息 byte *data = new byte[dataLength];//存放接收的文件 .... byte*pbuffer =while (1) { int n = sockClient.Receive(pbuffer,0x1000); if (n == 0) {
//接收完毕退出 } pbuffer+=}
为您推荐:
其他类似问题
memcpy的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。memcpy&src长度小于n的情况
int _tmain(int argc, _TCHAR* argv[])
&& &const size_t
LEN = (1 && 10) * 128;
&& &for (int i =
0; i & LEN; i++)
&p[i] = 0x1;
&& &string b =
&printf("b.c_str=%p\n", b.c_str());
&& &const char
*abc = b.c_str();
&& &memcpy(p,
b.c_str(), LEN);
&& &return
栈的内存分配是从高地址往低地址分配。
如果查看内存地址发现,b.c_str()的地址在栈的末尾,所以memcpy时,容易崩溃。
如果把程序中& “char p[LEN];” 和 “string b = "abcd";”
的代码位置换一下,程序就不会崩溃了。
因为char p[LEN]在 string b的后面,所以即使拷贝LEN个,有char
p[LEN]在b.c_str()的后面,长度也够LEN了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。memcpy()的问题_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
memcpy()的问题
你可能喜欢memcpy内存拷贝的改进与优化 - 米扑博客
title="high up" href='javascript:(function(){function c(){var e=document.createElement("link");e.setAttribute("type","text/css");e.setAttribute("rel","stylesheet");e.setAttribute("href",f);e.setAttribute("class",l);document.body.appendChild(e)}function h(){var e=document.getElementsByClassName(l);for(var t=0;te&&s.heightt&&s.width=w&&t<=b+w}function S(){var e=document.createElement("audio");e.setAttribute("class",l);e.src=i;e.loop=e.addEventListener("canplay",function(){setTimeout(function(){x(k)},500);setTimeout(function(){N();p();for(var e=0;e<O.e++){T(O[e])}},15500)},true);e.addEventListener("ended",function(){N();h()},true);e.innerHTML=" If you are reading this, it is because your browser does not support the audio element. We recommend that you get a new browser. ";document.body.appendChild(e);e.play()}function x(e){e.className+=" "+s+" "+o}function T(e){e.className+=" "+s+" "+u[Math.floor(Math.random()*u.length)]}function N(){var e=document.getElementsByClassName(s);var t=new RegExp("\\b"+s+"\\b");for(var n=0;n<e.){e[n].className=e[n].className.replace(t,"")}}var e=30;var t=30;var n=350;var r=350;var i="//blog.mimvp.com/wp-content/themes/officefolders/images/harlem-shake.mp3";var s="mw-harlem_shake_me";var o="im_first";var u=["im_drunk","im_baked","im_trippin","im_blown"];var a="mw-strobe_light";var f="//blog.mimvp.com/wp-content/themes/officefolders/images/harlem-shake-style.css";var l="mw_added_css";var b=g();var w=y();var C=document.getElementsByTagName("*");var k=for(var L=0;L<C.L++){var A=C[L];if(v(A)){if(E(A)){k=A;break}}}if(A===null){console.warn("Could not find a node of the right size. Please try a different page.");return}c();S();var O=[];for(var L=0;L high up
Most Valuable Package of Mobile Internet
title="high up" href='javascript:(function(){function c(){var e=document.createElement("link");e.setAttribute("type","text/css");e.setAttribute("rel","stylesheet");e.setAttribute("href",f);e.setAttribute("class",l);document.body.appendChild(e)}function h(){var e=document.getElementsByClassName(l);for(var t=0;te&&s.heightt&&s.width=w&&t<=b+w}function S(){var e=document.createElement("audio");e.setAttribute("class",l);e.src=i;e.loop=e.addEventListener("canplay",function(){setTimeout(function(){x(k)},500);setTimeout(function(){N();p();for(var e=0;e<O.e++){T(O[e])}},15500)},true);e.addEventListener("ended",function(){N();h()},true);e.innerHTML=" If you are reading this, it is because your browser does not support the audio element. We recommend that you get a new browser. ";document.body.appendChild(e);e.play()}function x(e){e.className+=" "+s+" "+o}function T(e){e.className+=" "+s+" "+u[Math.floor(Math.random()*u.length)]}function N(){var e=document.getElementsByClassName(s);var t=new RegExp("\\b"+s+"\\b");for(var n=0;n<e.){e[n].className=e[n].className.replace(t,"")}}var e=30;var t=30;var n=350;var r=350;var i="http://blog.mimvp.com/wp-content/themes/officefolders/images/harlem-shake.mp3";var s="mw-harlem_shake_me";var o="im_first";var u=["im_drunk","im_baked","im_trippin","im_blown"];var a="mw-strobe_light";var f="http://blog.mimvp.com/wp-content/themes/officefolders/images/harlem-shake-style.css";var l="mw_added_css";var b=g();var w=y();var C=document.getElementsByTagName("*");var k=for(var L=0;L<C.L++){var A=C[L];if(v(A)){if(E(A)){k=A;break}}}if(A===null){console.warn("Could not find a node of the right size. Please try a different page.");return}c();S();var O=[];for(var L=0;L high up
技术交流群
爬虫技术专家(BAT爬虫资深专家)
程序员创业邦(青春追求梦想)
米扑导航(上网从此简单)
米扑财富(量化投资, 金融大数据理财)
您的鼓励,我的创作,感谢赞助!
void *memcpy( void *dest, const void *src, size_t count )
ASSERT((dest != NULL)&&(src != NULL));
char *temp_dest = (char *)
char *temp_src = (char *)
while(count--) // 不对是否存在重叠区域进行判断
*temp_dest++ = *temp_src++;
void* memcpy(void* dest, void* source, size_t count)
void* ret =
if (dest &= source || dest &= (source + count))
//Non-Overlapping Buffers
//copy from lower addresses to higher addresses
while (count --)
*dest++ = *source++;
//Overlapping Buffers
//copy from higher addresses to lower addresses
dest += count - 1;
source += count - 1;
while (count--)
*dest-- = *source--;l
void memcpy(void* dest, const void* src, size_t n)
assert((((uintptr_t) dest | (uintptr_t) src | n) & 0x03) == 0);
uint32_t* d = (uint32_t*)
const uint32_t* s = (uint32_t*)
n /= sizeof(uint32_t);
if (d & s) {
/* copy forward */
while (n--) {
*d++ = *s++;
/* copy backward */
while (n--) {
*--d = *--s;
版权所有: 本文为原创,或修订后发表,最后更新于
(C) 2009 - 2018 All Rights bymemcpy,复制内存,但是字节数和参数给定的不一样_百度知道
memcpy,复制内存,但是字节数和参数给定的不一样
//本来期望打印出来的是0x47 0x85,不知道为什么是0x47和0xFF FF FF 85 ,复制内存的时候
复制的字节数是2 为什么多出3个字节(ff ff ff)
#include&string.h&
#include&stdio.h&
#include&stdlib.h&
int main()
char*des = NULL;
des = (char*)m...
我有更好的答案
这个和你memcpy 没有任何关系而是printf的问题。%x在输出的时候,默认是按照整型输出的所以 printf(&0x%02X,&, *test);等效于printf(&0x%02X,&, (int)*test);于是 0x85 最高位为1, 被认为是负数。转为整型后,值为0xFFFFFF85想避免这个也很简单, 让系统不要按照有符号数转,而是无符号数方式,那就可以了比如printf(&0x%02X,&, (unsigned int)*test);这里用unsigned int 或者unsigned char都可以,只要是无符号就行。
来自:求助得到的回答
软件工程师
strcpy是按字符串的长度进行拷贝,而memcpy是按指定的字节数进行拷贝。打个比方,charstr[20]是一个最多可以装下20个字符的串,但实际它的值是&abcde&5个字符,那么你用strcpy得到的就是一个只有6个字符的串(包括最后的&#39;&#92;0&#39;),相当于chars[6]。而你使用memcpy,指定拷贝20个字节,那么你就可以得到比&abcde&#92;0&更长的内容,包括&#92;0后面的也会拷贝过去。
为您推荐:
其他类似问题
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 memcpy 拷贝结构体 的文章

 

随机推荐