练习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编译时错误信息如下:
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标准支持这种写法.
有帮助望采纳~