首页 > 试题广场 >

以下哪个函数可以在源地址和目的地址的位置任意的情况下,在源地

[单选题]
以下哪个函数可以在源地址和目的地址的位置任意的情况下,在源地址和目的地址的空间大小任意的情况下实现二进制代码块的复制?
  • memcpy()
  • memmove()
  • memset()
  • strcpy()

memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。

但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。

所以选B

发表于 2015-04-13 19:47:30 回复(0)
函数原型:
char *strcpy(char* dest, const char *src)   把从src地址开始且含有NULL结束符的字符串复制到以dest开始的 地址空间
void *memcpy(void *dest, const void *src, size_t n);    从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中 
void *memmove( void* dest, const void* src, size_t count );   由src所指内存区域复制count个字节到dest所指内存区域。
void *memset(void *s, int ch,  size_t  n);   将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s

发表于 2016-09-15 19:43:23 回复(0)
void *memcpy( void *to, const void *from, size_t count ):
功能:函数从from中复制count 个字符到to中,并返回to指针。 如果to 和 from 重叠,则函数行为不确定。
void *memmove( void *to, const void *from, size_t count ):
功能:与mencpy相同,不同的是当to 和 from 重叠,函数正常仍能工作。
void *memset( void *buffer, int ch, size_t count ):
功能: 函数拷贝ch 到buffer 从头开始的count 个字符里, 并返回buffer指针。 memset() 可以应用在将一段内存初始化为某个值。
char *strcpy( char *to, const char *from ):
功能:复制字符串from 中的字符到字符串to,包括空值结束符。返回值为指针to。
发表于 2020-04-17 16:34:13 回复(0)
他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确.除此之外, memcpy速度比memmove快。
发表于 2017-05-20 10:33:17 回复(1)
我用VisualC++试,memcpy支持重叠。
发表于 2016-12-08 15:04:26 回复(1)
memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
发表于 2015-05-04 09:39:52 回复(0)
memcpy(),把源地址内容拷贝n个字节到目的地址。 memmove(),比memcpy()慢,但是,当区域重叠时,能正确处理; strcpy(),把源地址指针开始字符串拷贝到目的地址开始的内存,以Null结束。 memset(),初始化使用,把目的地址开始的n个置为目标值。
发表于 2017-09-24 02:35:08 回复(0)
memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
发表于 2015-11-01 11:09:45 回复(0)
gcc 7.3.0下memcpy, memmove,memccpy都能正确实现

发表于 2018-03-18 14:38:20 回复(0)
B. memmove()

`memmove()`函数可以在源地址和目的地址的位置任意的情况下,在源地址和目的地址的空间大小任意的情况下实现二进制代码块的复制。它是一个通用的内存块复制函数,并且能够处理内存块之间的重叠,确保数据复制的正确性。

`memcpy()`函数也可以用于复制内存块,但是它对于源地址和目的地址之间的内存块重叠情况没有保障,如果出现重叠,`memcpy()`的行为是未定义的,可能导致不可预料的结果。

`memset()`函数用于将一块内存的内容设置为给定的值,它并不用于内存块的复制。

`strcpy()`函数用于复制字符串(以null终止的字符数组),而不是二进制代码块的复制。它的操作针对字符数组,不适合复制其他类型的数据。
发表于 2023-08-02 20:00:12 回复(0)
memset(),初始化使用,把目的地址开始的n个置为目标值。那这个也没看出来哪里错了。
发表于 2023-03-07 17:13:21 回复(0)
考察memcpy()和memmove()函数,二者都能实现块从源到目的地的拷贝,区别在于memcpy函数的形式参数有关键字restrict修饰,即要求源和目的地的内存空间不能出现重叠,否则在块的拷贝过程中就有可能出错。
发表于 2022-03-21 13:35:03 回复(0)
memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。

但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。

所以选B
发表于 2021-12-03 09:23:01 回复(0)

memcpy内存重叠会储存 memmove不会

发表于 2020-03-05 18:10:30 回复(0)
memcpy与memmove的都是将N个字节的源内存地址的内容拷贝到目标内存地址中,但当源内存和目标内存存在重叠时,memcpy会出现错误,memmove能拷贝
编辑于 2019-07-03 12:40:15 回复(0)
memmove用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
发表于 2018-07-29 10:57:14 回复(0)
memcpy()
memmove()
...既然cpy不能给自己那段赋值,干嘛要这个,坑人啊。。。以后只用move就好了啊,或者说cpy是个裸奔的函数吧
发表于 2016-11-14 22:09:48 回复(0)
memmove地址空间可以重叠,但是memcpy重叠会出错
发表于 2016-10-28 16:29:40 回复(0)
注意源地址与目标地址重叠
发表于 2016-08-11 22:55:34 回复(0)
source(源地址)和destin(目标地址)所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。
发表于 2015-11-24 18:53:47 回复(0)