memset,memcpy,strcpy的使用与区别
1.memset
原型: extern void *memset(void *buffer, int c, int count);
功能: 把buffer所指内存区域的前count个字节设置成字符 c。注意,memset始终按字节赋值,
说明: 返回指向buffer的指针。用来对一段内存空间全部设置为某个字符, memset可以方便的清空一个结构类型的变量或数组。
使用:
char a[10];int b[10];
memset(a, '\0', sizeof(a));
memset(b,0,sizeof(int)*10);
struct _test{ char s[10];int x;int y; };
struct _test st,st1[10];
memset(&st,0,sizeof(struct _test)); //很方便的清空结构体
memset(st,0,sizeof(struct _test)*10);
2.memcpy
原型:extern void *memcpy(void*dest,void*src,unsignedintcount);
功能: 由src所指内存区域复制count个字节到dest所指内存区域。始终按字节拷贝,不判断目标是否有足够的大小。
说明: src和dest所指内存区域不能重叠,函数返回指向dest的指针.可以拿它拷贝任何数据类型的对象。
使用:
char a[10],b[5];
memcpy(b, a, sizeof(b)); /将a拷贝给b,*注意如果用sizeof(a),会造成b的内存地址溢出*/
3.strcpy
原型: extern char *strcpy(char *dest,char *src);
功能: 把src所指由NULL结束的字符串复制到dest所指的数组中。 注意,结束符号本身已经拷贝。
说明: src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳 src的字符串.返回指向dest的指针。
使用:
char a[100],b[50];
strcpy(a,b);//要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。
定义:
char *strcpy(char *strDest,const char *strSrc)
{
assert((strDest!=NULL)&&(strSrc !=NULL)) //判断指针是否合法,即分配内存,指向某块确定区域
char *address strDest; //记住目标地址的起始值
while((*strDest++=*strSrc++)!='\0') //先拷贝,后判断,这样就不用在拷贝完了后,再加一句
NULL; // *strDest = '\0'; -->即加一个结束符.因为字符串结束已拷贝了.
return address; //返回目标首地址的值。
}
可以看到,并不判断目标是否有足够大小。错误的使用如下:
int main(){
char s[]="123456789";
char d[]="1234"
strcpy(d,s);
cout<<d<<s<<endl;
}
输出为1234567896789。由于s,d的内存连续。故拷贝后结果为123456789/06789/0。此时访问了不可预知的地址。
strcpy和mempy的代码如下:
char * strcpy(char * dest, const char * src) // 实现src到dest的复制
{
if ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性
{ return NULL;
}
char *strdest = dest; //保存目标字符串的首地址
while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的内容复制到dest下
return strdest;
}
void *memcpy(void *memTo, const void *memFrom, size_t size)
{
if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必须有效
return NULL;
char *tempFrom = (char *)memFrom; //保存memFrom首地址
char *tempTo = (char *)memTo; //保存memTo首地址
while(size -- > 0) //循环size次,复制memFrom的值到memTo中
*tempTo++ = *tempFrom++ ;
return memTo;
}
4.三者区别
memset 主要应用是初始化某个内存空间。用来对一段内存空间全部设置为某个字符,一般用于在对定义的字符串初始化为'\0'
memcpy 是用于copy源空间的数据到目的空间中。是用来做内存拷贝,可以用来拷贝任何数据类型的对象,可以指定拷贝的数据长度。
strcpy 用于字符串copy,遇到‘\0’,赋值完结束符即结束。但是注意,'\0'已经被拷贝。
例子:
char str1[]="123456789";
char str2[]="123456789"; memcpy(str1,str1+2,strlen(str1+2));
strcpy(str2,str2+2);
str1="345678989";
str2="3456789";
memset,memcpy,strcpy的使用与区别的更多相关文章
- C的memset,memcpy,strcpy 的区别 及memset memcpy memmove源码
extern void *memcpy(void *dest,void *src,unsigned int count);#include <string.h> 功能:由src所指内存 ...
- memset,memcpy,strcpy
http://www.cppblog.com/junfeng568/archive/2006/03/11/4022.html
- memcpy、memmove、memset及strcpy函数实现和理解
memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h> ...
- 逆向 string.h 函数库 memset、strcpy、strcmp 函数
memset 函数 函数原型:void *memset(void *str, int c, size_t n) 主要功能:复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符 ...
- C++:memset ,memcpy 和strcpy 的根本区别!
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h&g ...
- memset memcpy函数
memset 函数 1.其头文件为: #include<memory> 或者#include<string> 2.原型 看清是对每个字节,不是其类型 void *mems ...
- memset,memcpy,memcmp用法
void* memset(void *s, int ch, size_t n); 将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值. 例如:memset(lpMyStruct ...
- strcpy, mencpy, memmove三者区别
首先来看strcpy,目的是实现字符串的复制,这里需要注意几个点: 1.判断指针的有效性 2.将复制后的指针地址返回,为了支持链式操作 3.不要忘记将字符串最后一个自负'\0'复制给dest 4.注意 ...
- memset memcpy
memset与memcpy的用法: void *memset(void *s,int c,size_t n)总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 cmemset可以方便的清空一个 ...
随机推荐
- 使用java代码打开特定网页
第一种方法的代码如下所示: import java.io.File; public class Test04 { public static void main(String[] args) { // ...
- Composer如何安装(安装注意事项)
Composer如何安装(安装注意事项) 一.总结 一句话总结:安装的时候主要看安装错误提示: 常见的错误有: a.php需要开启openssl配置.我们打开php目录下的php.ini.将opens ...
- 怎么用API网关构建微服务
选择将应用程序构建为微服务时,需要确定应用程序客户端如何与微服务交互.在单体应用程序中,只有一组端点.而在微服务架构中,每个微服务都会暴露一组通常是细粒度的端点.在本文中,我们将讨论一下这对客户端与应 ...
- Uninstall Office 2016 for Mac
官方原文:https://support.office.com/en-us/article/Uninstall-Office-2016-for-Mac-eefa1199-5b58-43af-8a3d- ...
- 一张图入门QT设计器
哈哈哈,这个名字听起来就是骗阅读量的.
- 关于js冒泡、捕获、以及阻止冒泡
有如下html <ul> <li> <p> <a href="javascript:;">click me</a> &l ...
- 又是毕业季1&&又是毕业季2
又是毕业季2 n/k; 又是毕业季2 一开始很容易想到枚举n个数取k个的所有组合,然后分别用辗转相除法求最大公约数,但是复杂度明显不符合要求,于是必须换一种思路. 我们想到,k个数的公约数含义就是这k ...
- HihoCoder1105 题外话·堆(基础二叉搜索树)
第1行为1个整数N,表示需要处理的事件数目. 接下来的M行,每行描述一个事件,且事件类型由该行的第一个字符表示,如果为'A',表示小Ho将一粒糖果放进了盒子,且接下来为一个整数W,表示这颗糖果的重量: ...
- MySQL实战 | 06/07 简单说说MySQL中的锁
原文链接:MySQL实战 | 06/07 简单说说MySQL中的锁 本文思维导图:https://mubu.com/doc/AOa-5t-IsG 锁是计算机协调多个进程或纯线程并发访问某一资源的机制. ...
- Bender Problem
Robot Bender decided to make Fray a birthday present. He drove n nails and numbered them from 1 to n ...