使用`memmove`

时间:2017-03-27 20:31:09

标签: c arrays memory memmove

假设我有一个像这样的整数数组

#define MAX 5
int bar [MAX] = {0};
int foo [MAX] = {3,1,0,0,0};

现在我想移动这个数组,使所有空条目都在左边,即bar = {0,0,0,3,1}

我以为我可以通过

来做到这一点
  1. 查找我必须执行的班次数
  2. 使用memmove()进行转变。
  3. 我用以下循环解决了1.

    for (shift = MAX - 1; shift >= 0; --shift) {
        if (foo[shift]) break;
    }
    

    但我现在不知道如何使用memmove()执行转换,我尝试memmove(bar + shift, foo, MAX * sizeof(*foo)-1);但没有成功。

    memmove()是这份工作的正确工具吗?如何按照描述循环整数数组?如果在bar作为指针传递的函数内发生这种情况怎么办?

1 个答案:

答案 0 :(得分:3)

  • 您用来计算shift的公式并未显示要转移的位置数。

  • 您没有移动正确的字节数(MAX * sizeof(*foo)-1绝不会基于尾随零的数量。)

#include <string.h>

#define MAX 5
int bar[MAX] = {0};
int foo[MAX] = {3,1,0,0,0};

int i;
int shift = 0;
for (i=MAX; i--; ) {
   if (foo[i]) {
      shift = MAX - (i + 1);
      break;
   }
}

memcpy(bar+shift, foo, (MAX-shift) * sizeof(*foo));
memcpy(bar, foo+(MAX-shift), shift * sizeof(*foo));

您可以就地执行此操作,因为您知道&#34;旋转&#34;是什么值。

memmove(foo+shift, foo, (MAX-shift) * sizeof(*foo));
memset(foo, 0, shift * sizeof(*foo));
由于目标和源缓冲区可能重叠,因此必须使用

memmove而不是memcpy