Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C memmove()的代码_C_Memmove - Fatal编程技术网

C memmove()的代码

C memmove()的代码,c,memmove,C,Memmove,下面的代码片段显示了memmove()的实现 为什么my_memmove()工作不正常(它更改my_str以输出空字符串)?对于无符号整数,条件i>=0始终为真。最好使用“-1”反转偏差编写惯用循环: for (i = 0; i != size; ++i) d[size - i - 1] = s[size - i - 1]; 另外,附加条件s[i]&&看起来显然是错误的。对于无符号整数,条件i>=0总是正确的。最好使用“-1”反转偏差编写惯用循环: for (i = 0; i != s

下面的代码片段显示了
memmove()
的实现


为什么my_memmove()工作不正常(它更改my_str以输出空字符串)?

对于无符号整数,条件
i>=0
始终为真。最好使用“-1”反转偏差编写惯用循环:

for (i = 0; i != size; ++i)
    d[size - i - 1] = s[size - i - 1];

另外,附加条件
s[i]&&
看起来显然是错误的。

对于无符号整数,条件
i>=0
总是正确的。最好使用“-1”反转偏差编写惯用循环:

for (i = 0; i != size; ++i)
    d[size - i - 1] = s[size - i - 1];

另外,附加条件
s[i]&&
看起来完全错误。

您假设src和dest指向 指向同一内存块中的点

...
char* d = (char*)dest;
char* s = (char*)src;

if( s > d )
...
这意味着,如果任何人调用您的函数时src和dest指向内存中的两个不同位置,您将得到未定义的行为


这非常糟糕,只需使用内置的memmove()。

您假设src和dest是指向的 指向同一内存块中的点

...
char* d = (char*)dest;
char* s = (char*)src;

if( s > d )
...
这意味着,如果任何人调用您的函数时src和dest指向内存中的两个不同位置,您将得到未定义的行为


这非常糟糕,只需使用内置的memmove()。

这一定是一个家庭作业,因为这是到目前为止这个问题的第二个副本。同时,你到底为什么要在这里比较>或<的指针?还有,为什么要用
s[i]
进行空检查?您已经有了大小。@b说明它会影响循环的方向。memmove必须防止内存重叠。使用s[i]进行null检查可处理过大的内存。如果大小是50怎么办?@Aashish:没有任何东西可以处理错误的函数参数。如果你的用户想要破坏你的代码,他们可以。记录你的函数,让你的用户担心是否正确使用它。这一定是一个家庭作业,因为这是这个问题到目前为止的第二份副本。同时,你到底为什么要在这里比较>或<的指针?还有,为什么要用
s[i]
进行空检查?您已经有了大小。@b说明它会影响循环的方向。memmove必须防止内存重叠。使用s[i]进行null检查可处理过大的内存。如果大小是50怎么办?@Aashish:没有任何东西可以处理错误的函数参数。如果你的用户想要破坏你的代码,他们可以。记录你的函数,让你的用户担心如何正确使用它。它也可以写成
,而(size--)d[size]=s[size]当(大小--)d[size]=s[size]时,它也可以写为