函数传参过多会自动html调用js函数 参数memcpy么

下次自动登录
现在的位置:
& 综合 & 正文
深度剖析函数memcpy
memcpy,C++
void memcpy(void* pDest, void* pSource, size_t size)
byte* pTempDest
= (byte*)pD
byte* pTempSource = (byte*)pS
while(size--&0);
*pTempDest++ = *pTempSource++;
(1)编译是没有问题的。在指针命名规则 p
DisplayString( char* pString);
DisplayString(memcpy(...));
改正这点后的代码如下:
void* memcpy(void* pDest, void* pSource, size_t size)
byte* pTempDest
= (byte*)pD
byte* pTempSource = (byte*)pS
while(size--&0);
*pTempDest++ = *pTempSource++;
” void* pDest, void* pSource”
void* memcpy(void* pDest, void* pSource, size_t size)
ASSERT( (pDest != NULL) && (pSource != NULL) );
if( (pDest == NULL) || (pSource == NULL))
byte* pTempDest
= (byte*)pD
byte* pTempSource = (byte*)pS
while(size--&0);
*pTempDest++ = *pTempSource++;
(3)” while(size--&0);”,”;” ”NULL”
while(size--&0);
while(size--&0)NULL;
void* memcpy(void* pDest, void* pSource, size_t size)
ASSERT( (pDest != NULL) && (pSource != NULL) );
if( (pDest == NULL) || (pSource == NULL))
return NULL;
byte* pTempDest
= (byte*)pD
byte* pTempSource = (byte*)pS
while(size--&0)
*pTempDest++ = *pTempSource++;
(4) chFrom[MAX_PATH] = {""};
char* pTo = &chFrom[1];
memcpy(pTo,chFrom,sizeof(chFrom));
这里的拷贝结果我我们设定的结果完全不一样,问题就在内存重叠
(memory overlap)* memcpy(void* pDest, void* pSource, size_t size)
ASSERT( (pDest != NULL) && (pSource != NULL) );
if( (pDest == NULL) || (pSource == NULL))
return NULL;
byte* pTempDest
= (byte*)pD
byte* pTempSource
= (byte*)pS
ASSERT(pTempDest &= pTempSource+size || pTempSource &= pTempDest+size);
if( (pTempDest & pTempSource+size) || (pTempSource & pTempDest+size))
memmove(pTempDest,pTempSource,size);
while(size--&0)
*pTempDest++ = *pTempSource++;
Cmemmovememory overlapmemmove
(5)C++ test tool
void* memcpy(void* pDest, void* pSource, size_t size)
byte* pTempDest
= (byte*)pD
byte* pTempSource
= (byte*)pS
ASSERT( (pTempDest != NULL) && (pTempSource != NULL) );
if( (pTempDest == NULL) || (pTempSource == NULL))
return NULL;
ASSERT(pTempDest &= pTempSource+size || pTempSource &= pTempDest+size);
if( (pTempDest & pTempSource+size) || (pTempSource & pTempDest+size))
memmove(pTempDest,pTempSource,size);
while(size--&0)
*pTempDest++ = *pTempSource++;
(6) “if()…else”if
void TestIfCase(int i)
int k = 0;
for(k = 0; k &= ; k++)
if( i == 10)
int nk = 0;
else if(i == 9)
int nk = 0;
else if(i == 8)
int nk = 0;
else if(i == 7)
int nk = 0;
else if(i == 6)
int nk = 0;
int nk = 0;
void Test()
DWORD dwStart = GetTickCount();
TestIfCase(1);
DWORD dwSize = GetTickCount() - dwS
dwStart = GetTickCount();
TestIfCase(10);
DWORD dwSize1 = GetTickCount() - dwS
dwSize 711, dwSize1360,ifmemcpymemory overlapping* memcpy(void* pDest, void* pSource, size_t size)
byte* pTempDest
= (byte*)pD
byte* pTempSource
= (byte*)pS
ASSERT( (pTempDest != NULL) && (pTempSource != NULL) );
if( (pTempDest == NULL) || (pTempSource == NULL))
return NULL;
ASSERT(pTempDest &= pTempSource+size || pTempSource &= pTempDest+size);
if( (pTempDest &= pTempSource+size || pTempSource &= pTempDest+size))
while(size--&0)
*pTempDest++ = *pTempSource++;
memmove(pTempDest,pTempSource,size);
实际上,这里只有
void* memcpy(void* pDest, void* pSource, size_t size)
byte* pTempDest
= (byte*)pD
byte* pTempSource
= (byte*)pS
ASSERT( pTempDest != NULL );
ASSERT( pTempSource != NULL );
if( pTempDest == NULL )
return NULL;
if( pTempSource == NULL)
return NULL;
ASSERT( (pTempDest &= pTempSource+size || pTempSource &= pTempDest+size) );
if( (pTempDest &= pTempSource+size || pTempSource &= pTempDest+size))
while(size--&0)
*pTempDest++ = *pTempSource++;
memmove(pTempDest,pTempSource,size);
&&&&推荐文章:
【上篇】【下篇】写一个memcpy()函数你能拿几分?
一、简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以
不考虑性能的话,()在C99编译器下可以写为:void *(void *restrict dest, const void *restrict src, size_t n)
const char *s =
assert(dest && src);
assert((src + n &= dest) || (dest + n &= src));
for (i = 0; i & i++)
d[i] = s[i];
}这里有几个得分点:这里的几个关键点解释如下:src指针前面要加const,暗示src是输入参数;src和dest是非重叠内存,restrict关键字暗示编译器可以优化内存访问的编译;断言(assert) src和dest非空,拷贝的源头和目的地非重叠,程序员要理解出错处理和断言的区别;返回void *。最后的拷贝的for循环全部做对,本题得分为0。
你最喜欢的对比C语言中memccpy()函数和memcpy()函数的用法
投稿:goldensun
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了对比C语言中memccpy()函数和memcpy()函数的用法,二者都是用于复制内存内容,注意区别,需要的朋友可以参考下
C语言memccpy()函数:复制内存中的内容
#include &string.h&
定义函数:
void * memccpy(void *dest, const void * src, int c, size_t n);
函数说明:memccpy()用来拷贝src 所指的内存内容前n 个字节到dest 所指的地址上。与memcpy()不同的是,memccpy()会在复制时检查参数c 是否出现,若是则返回dest 中值为c 的下一个字节地址。
返回值:返回指向dest 中值为c 的下一个字节指针。返回值为0 表示在src 所指内存前n 个字节中没有值为c的字节。
#include &string.h&
char a[] = "string[a]";
char b[] = "string(b)";
memccpy(a, b, 'B', sizeof(b));
printf("memccpy():%s\n", a);
执行结果:
memccpy():string(b)
C语言memcpy()函数:复制内存内容(忽略\0)
#include &string.h&
memcpy() 用来复制内存,其原型为:
void * memcpy ( void * dest, const void * src, size_t num );
memcpy() 会复制 src 所指的内存内容的前 num 个字节到 dest 所指的内存地址上。
memcpy() 并不关心被复制的数据类型,只是逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据类型进行复制。
需要注意的是:
dest 指针要分配足够的空间,也即大于等于 num 字节的空间。如果没有分配空间,会出现断错误。
dest 和 src 所指的内存空间不能重叠(如果发生了重叠,使用 memmove() 会更加安全)。
与 strcpy() 不同的是,memcpy() 会完整的复制 num 个字节,不会因为遇到“\0”而结束。
【返回值】返回指向 dest 的指针。注意返回的指针类型是 void,使用时一般要进行强制类型转换。
代码示例:
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
#define N (10)
int main()
char* p1 = "abcde";
char* p2 = (char*)malloc(sizeof(char) * N);
char* p3 = (char*)memcpy(p2, p1, N);
printf("p2 = %s\np3 = %s\n", p2, p3);
p2 = NULL;
p3 = NULL;
system("pause");
运行结果:
p2 = abcde
p3 = abcde
代码说明:
1) 代码首先定义p1,p2,p3三个指针,但略有不同,p1指向一个字符串字面值,给p2分配了10个字节的内存空间。
2) 指针p3通过函数memcpy直接指向了指针p2所指向的内存,也就是说指针p2、p3指向了同一块内存。然后打印p2,p3指向的内存值,结果是相同的。
3) 最后按照好的习惯释放p2,并把p3也置为NULL是为了防止再次访问p3指向的内存,导致野指针的发生。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具二次元同好交流新大陆
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
& 日9:45:11& & 该例子说明几个问题& & 1. mem开头的函数基本上都是对内存操作的,& & 它们不管内存里放的是什么数据,只要给出长度,它们就操作。& & 不像strcpy、strcmp等函数一定以'\0'结尾,而且是字符。& & mem可以操作可见字符、不可见字符、控制字符等,任意数据都可以。& & 2. memcpy是内存复制函数& & & 原型:&& & & & void * memcpy(void *dest, void const *src, unsigned int length);&& & & 功能:从src的起始位置复制length个字节到dst的内存起始位置。你可以用这种& & & & & & 方法复制任何类型的值,第3个参数指定复制值的长度(以字节计)。& & & & & & 如果src和dst以任何形式出现了重叠,它的结果是未定义的。& & 3. memset函数& & & 原型:void * memset(void *a, int val, unsigned int length);& & & 功能:把从a开始的length个字节都设置为值val。& & & 例子:memset(buffer, 0, SIZE);测试环境vc6.0********************************************************************/#include &stdio.h&#include &string.h& & &// 包含memcpy函数#define SIZE & & 10int main(void){/*&& int i = 0;& char a[10] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};& char b[5];& memcpy(b, a, 10);& for (i = 0; i & 5; i++)& {& & printf("b[%d] = %d\n", i, b[i]);& }& //printf("b[5] = %d\n", b[5]); & &// 引用超过数组下标的元素,编译不会报错,但逻辑上就错了。*//*&& int a[5] = {1, 2, 3, 4, 5};& int b[10];& memcpy(b, a, sizeof(int) * 5);& for (i = 0; i & 10; i++)& {& & printf("b[%d] = %d\n", i, b[i]);& }*//*& // 数组src和dst都是char类型,从数组src复制SIZE个字节到数组dst.& // 但是,两个数组都是整型数组该怎么办?参见下面的例子。&& char src[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8 ,9, 10};& char dst[SIZE];&&& memcpy(dst, src, SIZE);&&& for (i = 0; i & SIZE; i++)& & printf("%-5d ", dst[i]);& &&& printf("\n");*//*& // 数组src和dst都是int类型,将数组src内容复制到dst数组。& // 前两个参数并不需要使用强制类型转换,因为在函数的原型中,参数的类型是 void *型指针,& // 而任何类型的指针都可以转换为void *型指针。&& int src[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8 ,9, 10};& int dst[SIZE];&&& memcpy(dst, src, sizeof(int) * SIZE);& //memcpy(src,dst, sizeof(dst));&&& for (i = 0; i & SIZE; i++)& & printf("%-5d ", dst[i]);& &&& printf("\n");*/&& // 如果数组只有部分内容需要被复制,那么需要复制的数量必须在第3个参数中指明。& // 对于长度大于一个字节的数据,要确保把数量和数据类型的长度相乘。&& int src[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8 ,9, 10};& int dst[SIZE];&&& memcpy(dst, src, sizeof(int) * 3);&&& for (i = 0; i & SIZE; i++)& & printf("%-5d ", dst[i]);& &&& printf("\n");&& return 0;}/********************************************************************b[0] = 0b[1] = 1b[2] = 2b[3] = 3b[4] = 4Press any key to continueb[0] = 1b[1] = 2b[2] = 3b[3] = 4b[4] = 5b[5] = -b[6] = -b[7] = -b[8] = -b[9] = -(随机数)Press any key to continue1 & & 2 & & 3 & & 4 & & 5 & & 6 & & 7 & & 8 & & 9 & & 10Press any key to continue1 & & 2 & & 3 & & 4 & & 5 & & 6 & & 7 & & 8 & & 9 & & 10Press any key to continue1 & & 2 & & 3 & & - - - - - - -(随机数)Press any key to continue注意:这个语句有些编译器在编译时给警告,编译可以通过。& & & 执行时可能程序崩溃,因为内存访问非法,因为b定义时长度就5,& & & 这里复制了长度为10,超出了b的长度,但memcpy会照样复制过去,& & & 这时系统的安全机制就会触发,产生一个内存访问中断。程序就挂了。********************************************************************/
阅读(10120)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'memcpy函数语法 用法 例子',
blogAbstract:'/********************************************************************& 日9:45:11& & 该例子说明几个问题& & 1. mem开头的函数基本上都是对内存操作的,& & 它们不管内存里放的是什么数据,只要给出长度,它们就操作。& & 不像strcpy、strcmp等函数一定以\'\\0\'结尾,而且是字符。& & mem可以操作可见字符、不可见字符、控制字符等,任意数据都可以。',
blogTag:'c语法',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:8,
publishTime:7,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 函数调用缺少参数列表 的文章

 

随机推荐