【问题标题】:C - memmove() function - How many bytes am I moving in this implementation?C - memmove() 函数 - 我在这个实现中移动了多少字节?
【发布时间】:2011-10-29 02:16:38
【问题描述】:

这似乎是个好地方。我的问题是,我在 memmove() 的这个实现中移动了什么值(或多少字节)?

int main ()
{
char str[] = "memmove can be very useful......";
memmove (str+15,str+20,/*?*/);
puts (str);
return 0;
}

在下一个示例中,它说我要移动 11 个字节。但是是什么让它有 11 个字节呢?谁能解释一下?

int main ()
{
char str[] = "memmove can be very useful......";
memmove (str+20,str+15,11); //source and destination are reversed
puts (str);
return 0;
}

谢谢!

编辑:顺便说一句,字符串长度为 33,包括终止空字符。

【问题讨论】:

  • int main() 应该是 int main(void)。更重要的是,您需要#include <stdio.h>#include <string.h>。如果您的编译器没有对此发出警告,请提高其警告级别,直到发出警告为止。
  • 您向我们展示的不是“memmove() 的实现”,它只是一个调用memmove() 的程序。 memmove()实现将是运行时库中实际复制字节的代码。
  • 11 变成 11 个字节。呃。在第一个示例中,您不会移动任何东西,直到您将数字代替 /*?*/。您是否将 memmove 与 strcpy 混淆了?

标签: c memmove


【解决方案1】:

memmove 的第三个参数指定要移动的字节数,因此在第二个示例中,您要移动 11 个字节。您的第一个示例不应该编译,因为调用memmove 的行会出现语法错误。

【讨论】:

    【解决方案2】:

    memmove() 的最后一个参数是要移动的字节数 - 在本例中为 11

    【讨论】:

    • @Keith Thompson 你知道第一个例子应该是多少字节吗?
    • @Mikemmm:你想做什么?
    • @Keith Thompson 我正在尝试左移数组的元素,用右边的元素覆盖最初的元素,然后覆盖右边的所有元素。有点像从队列中删除。
    【解决方案3】:

    第三个参数定义要复制多少字节;在第一个示例中,您应该定义要复制的字节数。

    【讨论】:

    • 不正确。 str+15&str[15] 相同;这两个表达式的类型都是char*
    • 我在编辑后删除了我的反对票(尽管这对于其他答案仍然是多余的)。
    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    相关资源
    最近更新 更多