【发布时间】:2019-12-04 17:10:52
【问题描述】:
void* My_memmove(void *dest, const void *src, size_t size)
{
char *p1 = (char *)dest;
char *p2 = (char *)src;
if(NULL == p1 || NULL == p2)
{
return NULL;
}
p2 += size;
while(p2 != src && --p2 != dest)
if(p2 != src)
{
printf("inside IF \n");
p1 += size;
p2 = (char *)src + size;
while(size--)
{
*(--p1) = *(--p2);
}
}
else
{
printf("inside ELSE \n");
while(size--)
{
*(p1++) = *(p2++);
}
}
return dest;
}
int main(void)
{
char dest[15];
memset(dest, 0, 15);
printf("Enter the string : ");
scanf("%s", dest);
My_memmove(dest+3, dest, strlen(dest));
printf("dest+3 : %s \n", dest+3);
return (0);
}
您能否解释一下当 while(p2 != src && --p2 != dest) 后面没有分号时会发生什么? 因为上述程序适用于所有输入,除了大小为 4 的输入
结果:
输入字符串:12
在 IF 内
dest+3 : 12
输入字符串:123
在 IF 内
dest+3 : 123
输入字符串:1234
dest+3 : 4
输入字符串:12345
在 IF 内
dest+3 : 12345
输入字符串:123456
在 IF 内
dest+3 : 123456
大小为7时p2+size后的内存布局
p2+--+
|
src+-+ dst++ |
| | |
v v v
++-----+-------+--------+
|0|1|2|3|4|5|6|7|8| ... |
+-----------------------+
dest[15] -> |a|b|c|d|e|f|g|0|0| ... |
+-----------------------+
【问题讨论】:
-
while(predicate) body,首先没有给出正文。第二,正文是;。 -
这是一个苹果和橘子的比较。语句 2 是无用的,什么也不做。声明 1 不完整,因此我们无法说出它的作用。
-
@SRIKANTH 提供一个最小的完整程序来展示差异。
-
str似乎没有在任何地方定义。 -
更新了可运行的代码和结果
标签: c++ c pointers while-loop