如何将重复模式复制到内存缓冲区?

Dan*_*ani 6 c memcpy

我想在内存块中写一个重复的字节模式.我的想法是编写模式的第一个示例,然后将其复制到缓冲区的其余部分.例如,如果我从这开始:

ptr: 123400000000
Run Code Online (Sandbox Code Playgroud)

之后,我希望它看起来像这样:

ptr: 123412341234
Run Code Online (Sandbox Code Playgroud)

我以为我可以memcpy用来写相交区域,像这样:

memcpy(ptr + 4, ptr, 8);
Run Code Online (Sandbox Code Playgroud)

该标准没有指定副本将发生的顺序,因此如果某些实现使其以相反的顺序复制,则它可以给出不同的结果:

ptr: 123412340000
Run Code Online (Sandbox Code Playgroud)

甚至合并结果.

有没有让我仍然使用的解决方法memcpy,或者我是否必须实现自己的for循环?请注意,我无法使用,memmove因为它正是我正在努力避免的; 它让ptr成为123412340000我想要的123412341234.

我为Mac/iPhone(clang编译器)编程,但一般的答案也会很好.

cni*_*tar 5

这是kernel.org所说的:

memcpy()函数将n个字节从内存区域src复制到内存区域dest.内存区域不得重叠.如果内存区域重叠,请使用memmove(3).

这是MSDN所说的:

如果源和目标重叠,则memcpy的行为未定义.使用memmove处理重叠区域.


zne*_*eak 5

在存储器范围上重复字节模式没有标准功能.您可以使用memset_pattern*函数系列来获得固定大小的模式; 如果你需要改变大小,你必须自己动手.

// fills the 12 first bytes at `ptr` with the 4 first bytes of `ptr`
memset_pattern4(ptr, ptr, 12);
Run Code Online (Sandbox Code Playgroud)

请注意memset_pattern4,memset_pattern8并且memset_pattern16仅存在于Mac OS/iOS上,因此不要将它们用于跨平台开发.

否则,滚动执行每字节字节复制的(跨平台)函数非常容易.

void byte_copy(void* into, void* from, size_t size)
{
    for (size_t i = 0; i < size; i++)
        into[i] = from[i];
}
Run Code Online (Sandbox Code Playgroud)