牛客 题库 memcpy memmove memset strcpy

来源:互联网 发布:淘宝怎么找不到高仿表 编辑:程序博客网 时间:2024/06/09 18:17

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的字符串。

原创粉丝点击