数组传参,数组指针自加减,GCC编译报错

练习memcpy函数,自定义了my_memcpy函数,其中前置自加部分代码GCC编译报错。


```c
#include <stdio.h>
#include <string.h>
#include <assert.h>

void* my_memcpy(void* dest, const void* src, size_t count)
{
    char* ret = dest;
    assert(dest != NULL);
    assert(src != NULL);

    while (count--)
    {
        *(char*)dest = *(char*)src;
        ++(char*)dest;
        ++(char*)src;
    }
    return ret;
}

int main()
{
    int arr1[] = { 1,2,3,4,5 };
    int arr2[10] = { 0 };
    int* p;

    p = my_memcpy(arr2, arr1, sizeof(arr1));
    for (int i = 0; i < 5; i++)
    {
        printf("%d ",arr2[i]);
    }
    printf("\n");
    return 0;
}

gcc编译时错误信息如下:

img

error: lvalue required as increment operand 是说指针不能自加操作吗? 还是这里的(char*)dest 有特别的地方?

但是visual studio2019可以正常运行,是VS对代码有特别优化吗?

解决方案一:
形参再赋值给另一个指针变量,通过新指针变量进行自加减,GCC编译能通过。

#include <stdio.h>
#include <string.h>
#include <assert.h>

void* my_memcpy(void* dest, const void* src, size_t count)
{
    char* ret = dest;
    assert(dest != NULL);
    assert(src != NULL);
    char* pd = dest;
    const char* ps = src;

    while (count--)
    {
        *pd = *ps;
        pd++;
        ps++;
    }
    return ret;
}

int main()
{
    int arr1[] = { 1,2,3,4,5 };
    int arr2[10] = { 0 };
    int* p;

    p = my_memcpy(arr2, arr1, sizeof(arr1));
    for (int i = 0; i < 5; i++)
    {
        printf("%d ",arr2[i]);
    }
    printf("\n");
    return 0;
}

```

怀疑是不同编译器之间使用的C标准不同,你可以看一下两个ide用的都是什么C标准,可能较新的C标准支持这种写法.
有帮助望采纳~