7.24.2.2“ memmove
函数”:
memmove
函数将n
指向的对象中的s2
个字符复制到s1
指向的对象中。 进行复制,就像首先将n
所指向的对象中的s2
个字符复制到n
个字符的临时数组中一样s1
和s2
指向的对象,然后将临时数组中的n
个字符复制到s1
指向的对象
因此,如果我选择使用(file_size = 32K)移动大小为32K的缓冲区
memmove(io_Buffer, io_Buffer+17, file_size);
临时缓冲区的大小不是32K吗?
问题
程序可以自行分配动态内存吗?它会在那一行中分配和释放内存吗?
答案 0 :(得分:6)
我认为您错过了该句子中的“好像”。这意味着效果将与执行此操作相同,而不是实际上执行该操作。我从未见过实际使用临时数组的memmove
实现。
答案 1 :(得分:1)
memmove
在现代编译器中不是一个单一的实现;它被认为是内在的。用示例最简单地显示“好像” 的工作方式:
#include <string.h>
void test_memmove(void * restrict dst, const void * restrict src, size_t n) {
memmove(dst, src, n);
}
参数restrict
表示通过指针访问的内存不重叠。因此,海湾合作委员会knows to compile this to
test_memmove:
jmp memcpy
由于编译器能够考虑restrict
并“证明”这2个指向的内存区域不重叠,因此对memmove
的调用立即更改为(tail )致电memcpy
!