牛客 题库 memcpy memmove memset strcpy
2017-09-08 19:38
441 查看
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的字符串。
现二进制代码块的复制?
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的字符串。
相关文章推荐
- mem系列函数(memset memcpy memmove) 和str系列函数(strlen strcpy strcmp strcat strstr strtok)
- memset,strcpy memcpy memmove
- strcpy/memcpy/memmove的实现
- memcpy memset memmove
- memcpy memset memmove 区别(部分转载)
- 常用库函数编程实现用法总结(一)memmove memcpy strcpy strncpy
- strcpy/memcpy/memmove的实现
- 模拟实现memcpy/memmove/memset
- strcpy/memcpy/memmove
- strcpy vs memcpy vs memmove
- 模拟实现//strcpy //strncpy //strcat //strncat //strcmp //strncmp //memcpy //memmove
- 字符串函数(strcpy strncpy strcat strncat strcmp strncmp memcpy memmove)
- strcpy/memcpy/memmove的实现
- strcpy memcpy memmove区别和实现
- 由memcpy strcpy memmove看内存重叠
- 模拟实现: strstr strcpy strlen strcat strcmp memcpy memmove
- 模拟实现: strstr strcpy strlen strcat strcmp memcpy memmove
- memmove .memset .memcpy
- 常用的字符处理函数实现:strstr strcpy strcat memcpy memmove
- strcpy/memcpy/memmove三者的区别