我正在try 创建一个类似于Memmove的函数.我在中发现,复制是通过包括一个过渡数组来完成的,首先将字节复制到其中,该数组不应该与DEST重叠,然后再复制到目标.这是我试图编写的代码(包括必要的标头):

void    *ft_memmove(void *dest, const void *src, size_t n)
{
    unsigned char p[n];
    unsigned char *p2;
    const unsigned char *p3;
    size_t i;

    p2 = dest;
    p3 = src;
    i = 0;
    while (i < n)
        *(p + i++) = *(p3++);
    while (n--)
        *(p2++) = *(p++);
    return (dest);
}

我认为这个问题与将常量空数组的元素赋给p有关,而它是一个常量或类似的东西.我应该使用Malloc,还是有其他可能的方法?或者,我对Memmove实际上是如何工作的理解是错误的,因为我在其他地方找到了其他定义.

我在这个Main上运行了前面的代码:

int main()
{
    char s1[] = "holala";
    char s2[] = "dongo";

    ft_memmove(s1, s2, sizeof(s2));
    printf("%p,\n", s1);
}

它应该显示"donga",但我得到了这个错误:

ft_memmove.c:17:22: error: lvalue required as increment operand
   17 |         *(p2++) = *(p++);

推荐答案

p是一个数组,不是指针,所以不能递增.对临时数组和指针使用不同的变量,因此可以递增指针.

void    *ft_memmove(void *dest, const void *src, size_t n)
{
    unsigned char temp[n];
    unsigned char *p = temp;
    unsigned char *p2;
    const unsigned char *p3;

    p2 = dest;
    p3 = src;
    for (sizt_t i = 0; i < n; i++) {
        *(p++) = *(p3++);
    }
    p = temp;
    while (n--) {
        *(p2++) = *(p++);
    }
    return (dest);
}

或者,您可以像在第一个循环中将p赋给p一样,使用*(p2++) = *(p + i++)

C++相关问答推荐

海湾合作委员会是否保证大小匹配的访问?

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

字符数组,字符指针,在一种情况下工作,但在另一种情况下不工作?

sizeof结果是否依赖于字符串的声明?

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

手动矢量化性能差异较大

Malloc(sizeof(char[Length]))是否不正确?

在C中将通用字符名称转换为UTF-8

#If指令中未定义宏?

在C++中访问双指针

为什么将函数名括在括号中会禁用隐式声明?

什么是.c.h文件?

<;unistd.h>;和<;sys/unistd.h>;之间有什么区别?

从C中的函数返回静态字符串是不是一种糟糕的做法?

在C中使用无符号整数模拟有符号整数

为什么GCC不能在 struct 初始值设定项中以sizeof作为条件的三进制中处理复合文字的编译时求值?

C语言程序流程解释

Clang 是否为内联汇编生成了错误的代码?

段错误try 访问静态字符串,但仅有时取决于构建环境

为什么使用 C 引用这个 char 数组会导致 Stack smasing?