函数调用中的参数太多传参过多会自动调用memcpy么

memcpy函数是不是已经解决了内存重叠的问题呢?
[问题点数:20分]
memcpy函数是不是已经解决了内存重叠的问题呢?
[问题点数:20分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2014年10月 C/C++大版内专家分月排行榜第三2014年4月 C/C++大版内专家分月排行榜第三
2012年11月 挨踢职涯大版内专家分月排行榜第二2011年9月 Linux/Unix社区大版内专家分月排行榜第二
2012年1月 Linux/Unix社区大版内专家分月排行榜第三2011年8月 C/C++大版内专家分月排行榜第三2011年8月 Linux/Unix社区大版内专家分月排行榜第三2010年4月 C/C++大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2010年12月 C/C++大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年3月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。&1&#include&&stdio.h&&2&#include&&assert.h&&3&#include&&stdlib.h&&4&&5&void&*memcpy(void&*&des,void&const&*src,size_t&len);&6&void&print(int&*data,size_t&n);&&7&&8&int&main(void)&9&{10&&&&&&&&&int&des[11];11&&&&&&&&&int&src[11]={0,1,2,3,4,5,6,7,8,9,10};12&&&&&13&&&&&&&&&print(des,10);14&&&&&&&&&memcpy(des,src,sizeof(src));15&&&&&&&&&print(des,10);16&17&&&&&&&&&return&1;18&}19&20&void&print(int&*data,&size_t&n)21&{22&&&&&23&&&&&&&&&int&i=0;24&&&&&&&&&printf("\n");25&&&&&&&&&for(;i&n;i++)26&&&&&&&&&printf("%d&",data[i]);27&28&&&&&&&&&printf("\n");29&}30&31&void&*memcpy(void&*des,const&void&*src,size_t&len)32&{33&&&&&&&&&char&*&result&=34&&&&&&&&&const&char&*&from&=&35&&&&&&&&&assert(des&&src);36&&&&&&&&&while(len--)37&&&&&&&&&{&&&38&&&&&&&&&&&&&&&&&*(result++)&=&*(from++);39&&&&&&&&&}&&&40&&&&&&&&&return&41&}
阅读(...) 评论()1171人阅读
面试题(107)
题目:编写memcpy 函数
void* Memcpy(void* dst,const void* src,size_t count)
assert(dst != NULL && src != NULL && count & 0);
char* pDst = static_cast&char*&(dst);
const char* pSrc = static_cast&const char*&(src);
while (count--)
*pDst = *pS
说明:考察难点:指针的++、内存重叠问题。
(1)这里不考虑内存重叠的情况,即源地址和目的地址指向的内存可能是有重叠的情况。在标准库中,memcpy()考虑了地址重叠的情况,在下面的程序中讨论了这个问题。
(2)之所以要进行强制类型转换,是因为指向空的指针在执行++时,系统是不知道往前走几个字节的。所以强制转换为char*后,在++时,就会自动往前走一个字节。
(3)(一个知识盲点)这里还有一个问题要注意,由于变量src是const void* 类型,即指向的内容是不可变的。但是当存在内存重叠时,其值会发生改变,不知道这是为什么?
答:const只是在C++语法层面来检查是否对只读内存进行修改,但是在程序中对只读内存隐含的修改是没有办法的。
所以,在程序中,由于src指向的内容是只读的,编译器只会检测是否通过src对其指向的内存进行修改。此时在程序中没有通过src对src指向的内存进行修改,所以不会报错。但是由于当内存重叠时,指针dst可能修改src指向那块内存,此时这算是隐含的改变,编译器是没办法解决的。
(4)在VS2008编译器下,调用系统提供的函数memcpy和自己手写函数的比较:
#include &iostream&
#include &assert.h&
void* Memcpy(void* dst,const void* src,size_t count)
assert(dst != NULL && src != NULL && count & 0);
char* pDst = static_cast&char*&(dst);
const char* pSrc = static_cast&const char*&(src);
while (count--)
*pDst = *pS
int main()
char arrOne[10] = {'1','2','3','4','5'};
char arrTwo[10] = {'1','2','3','4','5'};
char arrTh[10] = {'1','2','3','4','5'};
char arrFor[10] = {'1','2','3','4','5'};
cout&&&--调用系统的函数---&&&
cout&&arrOne&& //12345
memcpy(arrOne + 1,arrOne,4);
cout&&arrOne&& //11234
cout&&arrOne + 1&&//1234
/*分析:此时应该从目的地址的尾部开始拷贝,一直到首地址结束,从而得到我们想要的结果*/
cout&&&--调用系统的函数---&&&
cout&&arrTwo&& //12345
memcpy(arrTwo,arrTwo + 1,4);
cout&&arrTwo + 1&&//3455
cout&&arrTwo&& //23455
/*分析:此时应该从目的地址的首地址开始拷贝,一直到尾部结束,从而得到我们想要的结果*/
cout&&&--调用手写的函数---&&&
cout&&arrTh&& //12345
Memcpy(arrTh + 1,arrTh,4);
cout&&arrTh&&
cout&&arrTh + 1&& //1111
/*分析:这个结果和我们想要的结果不同,算是错误结果。*/
/*原因:手写的字符串是从目的地址的首地址开始拷贝的,一直到尾部结束。这样的思路会导致结果不正确。*/
cout&&&--调用手写的函数---&&&
cout&&arrFor&& //12345
memcpy(arrFor,arrFor + 1,4);
cout&&arrFor + 1&&//3455
cout&&arrFor&& //23455
//分析:这个结果是我们的想要的结果,是正确结果
/*原因:要想得到我们想要的结果,就必须是从目的地址的首地址开始拷贝的,一直到尾部结束。这和手写算法的思路是一样的,因此是正确的。*/
system(&pause&);
(1)从结果看,在VS2008编译器下,调用系统提供的函数memcpy其实是做了内存重叠检测了。否则在前两个例子不会都正确的。
(2)在单步执行看代码时,memcpy直接优化成汇编代码了。由于看不到源码,只能猜测是做了内存重叠优化了。
(3)注意,内存拷贝时,可能会出现源地址内容改变的情况。系统提供的函数memcpy也是不能解决这个问题的。这会是一个隐含的问题,也就是说,执行过这个函数memcpy后,只能保证目的地址执行的内容是正确的,但是源地址执行的内容可能会改变,此时写程序要注意下。
(4)在面试写这个代码时,还是要问清楚是否要考虑内存重叠以及源地址是否能够改变的问题。
(5)另外,在
&看到的内容:
To avoid overflows, the size of the arrays pointed by both the destination and source parameters, shall be at least num bytes,
and should not overlap (for overlapping memory blocks, memmove is a safer approach).
是不是说,在使用函数memcpy时,其源地址指向的内存和目的地址指向的内存应该是不重叠的。即使不用做内存重叠检测的。
这貌似和VS下的memcpy函数实现思想是不同的。难道是标准不同?路过的大牛可以围观下。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:424253次
积分:6098
积分:6098
排名:第2609名
原创:207篇
转载:55篇
评论:186条
Java学习中,求交流,进步。
(10)(1)(7)(18)(32)(45)(29)(13)(1)(5)(7)(14)(14)(5)(1)(2)(3)(8)(2)(29)(16)新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID空间积分0 积分11阅读权限10帖子精华可用积分11 信誉积分168 专家积分0 在线时间30 小时注册时间最后登录
白手起家, 积分 11, 距离下一级还需 189 积分
帖子主题精华可用积分11 信誉积分168 专家积分0 在线时间30 小时注册时间最后登录
论坛徽章:0
我有一个程序里面频繁调用memcpy函数,大约30~40ms每次,会占用系统除源地址、目的地址外其他的内存资源吗?因为我发现是否注释memcpy这一行代码代码,使用top看到的系统空闲内存相差几百KB,而且貌似随着时间推移,还会缓慢增加,这可能吗?
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID空间积分0 积分5182阅读权限70帖子精华可用积分5182 信誉积分794 专家积分0 在线时间1428 小时注册时间最后登录
富足长乐, 积分 5182, 距离下一级还需 2818 积分
帖子主题精华可用积分5182 信誉积分794 专家积分0 在线时间1428 小时注册时间最后登录
论坛徽章:0
几百KB。。。
UID空间积分0 积分3756阅读权限50帖子精华可用积分3756 信誉积分497 专家积分0 在线时间407 小时注册时间最后登录
小富即安, 积分 3756, 距离下一级还需 1244 积分
帖子主题精华可用积分3756 信誉积分497 专家积分0 在线时间407 小时注册时间最后登录
论坛徽章:0
本帖最后由 伤不起 于
10:38 编辑
void *memcpy(void *dest, const void *src, size_t count)
{
char *tmp =
const char *s =
while (count--)
&&*tmp++ = *s++;
}复制代码或许函数原型能告诉我们些什么,我想。
UID空间积分0 积分156908阅读权限100帖子精华可用积分156908 信誉积分3806 专家积分55 在线时间5862 小时注册时间最后登录
帖子主题精华可用积分156908 信誉积分3806 专家积分55 在线时间5862 小时注册时间最后登录
论坛徽章:87
dongjiawei316 发表于
我有一个程序里面频繁调用memcpy函数,大约30~40ms每次,会占用系统除源地址、目的地址外其他的内存资源吗?
会啊,一块 10K 的数据,拷贝后就是 20K 了。
I can explain it for you, but I can’t understand it for you.
UID空间积分0 积分139阅读权限10帖子精华可用积分139 信誉积分203 专家积分0 在线时间117 小时注册时间最后登录
白手起家, 积分 139, 距离下一级还需 61 积分
帖子主题精华可用积分139 信誉积分203 专家积分0 在线时间117 小时注册时间最后登录
论坛徽章:0
频繁调用 memcpy,关键是你有没有频繁申请内存吧。。。
UID空间积分0 积分11阅读权限10帖子精华可用积分11 信誉积分168 专家积分0 在线时间30 小时注册时间最后登录
白手起家, 积分 11, 距离下一级还需 189 积分
帖子主题精华可用积分11 信誉积分168 专家积分0 在线时间30 小时注册时间最后登录
论坛徽章:0
没有啊!源和目的内存都是事先申请好的。
UID空间积分0 积分79阅读权限10帖子精华可用积分79 信誉积分33 专家积分0 在线时间25 小时注册时间最后登录
白手起家, 积分 79, 距离下一级还需 121 积分
帖子主题精华可用积分79 信誉积分33 专家积分0 在线时间25 小时注册时间最后登录
论坛徽章:0
拷贝的话 都在原目的地址上拷贝吗
UID空间积分0 积分139阅读权限10帖子精华可用积分139 信誉积分203 专家积分0 在线时间117 小时注册时间最后登录
白手起家, 积分 139, 距离下一级还需 61 积分
帖子主题精华可用积分139 信誉积分203 专家积分0 在线时间117 小时注册时间最后登录
论坛徽章:0
liuyang7078
你是指? man 一下 memcpy吧,就是从源地址 复制到 目的地址
当然目的地址有空间给你存储数据。
UID空间积分0 积分79阅读权限10帖子精华可用积分79 信誉积分33 专家积分0 在线时间25 小时注册时间最后登录
白手起家, 积分 79, 距离下一级还需 121 积分
帖子主题精华可用积分79 信誉积分33 专家积分0 在线时间25 小时注册时间最后登录
论坛徽章:0
拷贝原理很简单 就是两个指针 滚动赋值 我是说你的memcpy在频繁使用的时候 那个目的地址是不断赋予新值 还是使用就地址

我要回帖

更多关于 函数调用中的参数太多 的文章

 

随机推荐