memmove memcpy 区别和strcpy的区别

#include “memory.h”memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或;例:char a[100];memset(a, *, sizeof(a));
memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。
strcpy就只能拷贝字符串了,它遇到*就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个之前)是否超过50位,如超过,则会造成b的内存地址溢出。strcpy &原型:extern char *strcpy(char *dest,char *src); &用法:#include &string.h&&功能:把src所指由NULL结束的字符串复制到dest所指的数组中。&说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。& & & &返回指向dest的指针。memcpy &原型:extern void *memcpy(void *dest, void *src, unsigned int count);&用法:#include &string.h&&功能:由src所指内存区域复制count个字节到dest所指内存区域。&说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。memset&原型:extern void *memset(void *buffer, int c, int count);&用法:#include &string.h&&功能:把buffer所指内存区域的前count个字节设置成字符c。&说明:返回指向buffer的指针。ASSERT()是干什么用的&&ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序: &&&&…… &&&&ASSERT( n != 0); &&&&k = 10/ &&&&…… &&&&ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。 &&&&assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。 system(”pause”);系统的暂停程序,按任意键继续,屏幕会打印,“按任意键继续。。。。。” 省去了使用getchar();
— skyfei @ 12:02 pmPosts - 30,
Articles - 6,
Comments - 0
15:21 by 小竹新雨, ... 阅读,
strcpy和memcpy主要有以下3方面的区别。1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
函数原型:char&* strcpy(char&* dest, const&char&* src)
函数原型:void *memcpy1(void *desc,const void * src,size_t size)
memcpy1(dest,src,sizeof(src));(这里求长度一定要用sizeof,否则字符串的结束符不会被算进去)
关于memset:
函数原型:void *memset(void *s,int c,size_t n)
总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
void是一个通用类型,使用的时候可以用int、char等等。
memset() 函数常用于内存空间初始化。如:&char str[100];&memset(str,0,100);&
看下面的一个例子:
1 #include &stdio.h&
2 #include &string.h&
3 #include &stdlib.h&
4 //int argc , char *argv[]
5 int main()
int arr[10];
memset(arr , 1 , sizeof(arr));
for( i = 0 ; i & 10 ; i++)
printf("arr[i]=%d\n",arr[i]);
看到的结果和想想的不一样,
memset是给每个字节赋1,int有四个字节 即一个int附初值为转为10进制为&
这种情况应该用循环实现strcpy、sprintf、memcpy的区别
1、操作对象不同,strcpy是对字符串的操作,sprintf可以是任意数据类型,其目的对象是字符串。memcpy是任意数可操作的据类型内存地址。
2、执行效率不同:memcpy最高,其次strcpy,sprintf效率最低
3、实现功能不同:strcpy是将两字符串进行拷贝,sprintf是将其他数据类型转换成字符串,memcpy是内存块间的拷贝。
C++空类中有:默认的构造函数、默认析构函数、默认拷贝构造函数、默认赋值运算符、默认取地址运算符、用const修饰的取地址运算符。只有当实际使用这些函数的时候,编译器才会去定义它们。
拷贝构造函数与赋值运算符的认识:(1)拷贝构造函数是要生成一个新对象,而赋值运算符不能。(2)由于拷贝构造函数是直接构造一个新的对象,所以初始化这个对象之前不用检查源对象是否和创建对象相同。而赋值运算符则需要这个操作,另外赋值运算符中如果原来的对象中有内存分配要先内存释放掉。注意:当有类中有指针类型的成员变量时,一定要重写拷贝函数和赋值运算符,不要使用默认的。
类成员函数的重写、重载和隐藏的区别
(1)重写和重载主要有以下几点不同
范围的区别:被重写的和重写的函数在两个类中,而重载和被重载的函数在一个类中。
参数的区别:被重写函数和重写函数的参数列表一定相同,而被重载函数和重载函数的参数列表一定不同。
virtual的区别:重写的基类中被重写的函数必须要有virtual修饰,而重载函数和被重载函数可以被virtual修饰,也可以没有。
(2)隐藏和重写、重载有以下几点不同。
与重载的范围不同:与重写一样,隐藏函数和被隐藏函数在不同的一个类中。
参数的区别:隐藏函数和被隐藏函数的参数列表可以相同,也可以不同。但是函数名肯定要相同。当参数不相同时,无论基类中的函数是否被virtual修饰,基类的函数都被隐藏,而不是重写,也不会是重载。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。strcpy&memcpy理解 - 简书
strcpy&memcpy理解
其实当初就是随便用用,最近找实习,被问起来,还让写strcpy原型,好久没动了,就索性一块看看
strcpy只能拷贝字符串,memcpy还能拷贝其他的strcpy遇到 '\0' 拷贝结束(拷贝时将'\0’带过去),memcpy拷贝时带有长度参数
#include&string.h&
#include&cstring&//两者都可以
strcpy函数原型
char *strcpy(char* dest,const char* src)
assert((strDest!=NULL) && (strSrc !=NULL)); //如果两个为空则,直接中止
char* res =
while((*dest++ = *src++) != '\0')
strcpy实例1,,从小串拷贝到大串
其实strcpy复制过去是带字符串结束符 ‘\0’的
int main()
char a1[] = "";//sizeof(a1):10, strlen(a1):9
char a2[] = "abcd";
strcpy(a1, a2);//将字符数组a2拷贝到 数组a1中,
cout && "a1:" && a1 &&//输出:abcd
cout && "a2:" && a2 &&//输出:abcd
cout && "sizeof(a1):" && sizeof(a1) &&//输出:10
cout && "strlen(a1):" && strlen(a1) &&//输出:4
//输出:abcd 6789 (中间一个空格为'\0')
环境为Dev C++
for (int i = 0; i & sizeof(a1); i++)
cout && a1[i];
在VS2013中输出的结果不同,以上执行拷贝后输出abcd 后面的全部都为空格,并且在VS2013中,用strcpy会提示错误,让用strcpy_s代替strcpy函数。
strcpy实例二:大串拷贝到小串
char a2[] = "";//将a1、a2互换之后
char a1[] = "abcd";
//将字符数组a2(123...789)拷贝到
数组a1(abcd)中,
strcpy(a1, a2);
cout && "a1:" && a1 &&//输出:
cout && "a2:" && a2 &&//输出:
cout && "sizeof(a1):" && sizeof(a1) &&//输出:5
cout && "strlen(a1):" && strlen(a1) &&//输出:9
//输出:12345,如果将sizeof(a1)加上4,输出:
for (int i = 0; i & sizeof(a1)+4; i++)
cout && a1[i];
实例二在Dev中可以运行,在VS2013中不可以运行(即使将strcpy改成strcpy_s运行时也出错)
实际环境中使用
在实际环境中,无论是用strcpy还是strcpy_s函数时,都需要留一个字符串结束的空间,如string的拷贝构造函数。
String::String(const char *str)
if(str == NULL){//为空,分配一个空间存放结束符
*m_data = '\0';
int length = strlen(str);//算上\0
m_data = new char[length+1];
strcpy_s(m_data, len+1,str); //将str中字符串复制到m_data,最后一个空间为'\0'结束符
//strcpy(m_data,str);//或者用strcpy
memcpy函数
void *memcpy(void*dest, const void *src, size_t n);dest 目的字符串src 原字符串n 拷贝的字节数,常为sizeof(xxx)
void memcpyTest()
int a[] = { 1, 2, 3, 4, 5, 6 };
int b[] = { 10, 11, 12 };
//memcpy(a, b, sizeof(b));//如果 sizeof(b) 写成3,就只能将数字10拷贝过去(0-3)
//printArray(a, sizeof(a)/4);//输出:10,11,12,4,5,6,
//memcpy(a, b, sizeof(a));//以a数组的长度,b数组的内容
//printArray(a, sizeof(a) / 4);//输出:10,11,12,-,-,
//memcpy(a, a + 1, sizeof(a));//取全部数据拷贝
//printArray(a, sizeof(a) / 4);//输出:2,3,4,5,6,-,
a+1:地址为2所在的地址,2,3,4,5,6
取前三个(2,3,4)替换原来的前三个(1,2,3)
得到:2,3,4,4,5,6
//memcpy(a, a + 1, sizeof(b));//取一部分数据拷贝 len(b)&len(a)
//printArray(a, sizeof(a) / 4);//输出:2,3,4,4,5,6
a:1,2,3,4,5,6,前三个为:1,2,3
a+1为:2,3,4,5,6,前三个为:2,3,4
将a拷贝到a+1: 1,2,3,5,6,(前三个替换)
输出是从a开始,再加上a的第一个:1,就成了:1,1,2,3,5,6
memcpy(a + 1, a, sizeof(b));//将a,拷贝a+1
printArray(a, sizeof(a)/4);//此时:1,1,2,3,5,6}

我要回帖

更多关于 memcpy函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信