牛客 题库 memcpy memmove memset strcpy

谁说我不能喝 提交于 2019-12-07 09:14:52

1.以下哪个函数可以在源地址和目的地址的位置任意的情况下,在源地址和目的地址的空间大小任意的情况下实 现二进制代码块的复制?

  memcpy、 memmove、 memset 、strcpy

解答:memmove 

1)memcpy 

函数原型

void *memcpy(void*dest, const void *src, size_t n);

功能

由src指向地址为起始地址的连续n个字节的数据复制到以dest指向地址为起始地址的空间内。

头文件

#include<string.h>

返回值

   函数返回一个指向dest的指针。

说明

  1.source和dest所指内存区域不能重叠,函数返回指向destin的指针。

  2.与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。

memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;

例:

char a[100], b[50];

memcpy(b, a,sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。

strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:

char a[100], b[50];

strcpy(a,b);

  3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加

数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

  //注意,source和destin都不一定是数组,任意的可读写的空间均可。

2)memmove

原型:  

void *memmove( void* dest, const void* src, size_tcount );

#include<string.h>

由src所指内存区域复制count个字节到dest所指内存区域。

src和dest所指内存区域可以重叠,但复制后dest内容会被更改。函数返回指向dest的指针

memcpy和memmove的比较:作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的

结果是正确的,memcpy不保证拷贝的结果的正确。

3)memset

函数原型是extern void *memset(void *buffer, int c, int count) 

buffer:为指针或是数组,

c:是赋给buffer的值,

count:在buffer中,c的个数

函数功能是将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的

内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针,

它是对较大的结构体或数组进行清零操作的一种最快方法。如:memset(buffer, 0, sizeof(buffer))

Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;

例:char a[100];memset(a, '/0', sizeof(a));

需要注意的几点

(1)memset中的第三个参数一定要使用sizeof操作符,因为每个系统下对类型长度的定义可能不一样。

(2)memset中的第一个参数一定要是一个已知的、已经被分配内存的地址,否则会出错。
4)strcpy
原型:extern char *strcpy(char *dest,char *src);

功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间,返回dest(地址中存储的

为复制后的新值)。

要求:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!