读书人

一个memmove函数解决思路

发布时间: 2012-02-27 10:00:22 作者: rapoo

一个memmove函数
写了一个函数
好像不是很对
各位大虾指点
#include <stdio.h>
#include <string.h>

void memmove_0(void *dest,void *src,int n);
void main(void)
{
char str_1[6]= "hello ";
char str_0[10] ;
memmove((void*)str_0,(void*)str_1,4);
printf( "%s ",str_0);

}
void memmove_0(void *dest,void *src,int n)
{
char *dest_str;
char *src_str ;
dest_str = (char*)dest;
src_str = (char*)src ;

do
{

*dest_str = *src_str;
dest_str++;
src_str ++;
if( (dest_str> =(char*)src) || (src_str> =(char*)dest) )
return;
}while(--n);
*dest_str= '\0 ';

}

[解决办法]
if( (dest_str> =(char*)src) || (src_str> =(char*)dest) )
return;
src_str肯定是大于dest的阿
+-----+
| |
| | <-src_str
+-----+ <- src
| |
| | <-dest_str
| | <- dest
用这个来表示main()的堆栈,memmove_0中指针的位置关系应该大致是这样才对。
src_str一开始就要比dest大阿。
更何况你为什么要在memmove_0中做这个判断呢?
[解决办法]
void memmove_0(void *dest,void *src,int n);
void main(void)
{
char str_1[6]= "hello ";
char str_0[10] ;
memmove((void*)str_0,(void*)str_1,4); //处调用的是string.h中声明的库函数,和你的函数名不同
printf( "%s ",str_0);

}
还有程序有很多不规范的地方,特别是子程序!!你试想要下面这段代码的结果吧?
void memmove_0();
main(void)
{
char str_1[6]= "hello ";
char str_0[10];
memmove_0(str_0,str_1,4);
printf( "%s ",str_0);
getch();

}

void memmove_0(char *dest,char *src,int n)
{

do
{
*dest++ = *src++;
}while(n--);
*dest=0;
}
[解决办法]
--n就少循环一次了!最后的字母‘0’就会被*dest=0; 覆盖掉,得到的结果就只能是“hell”
[解决办法]
UP
[解决办法]
你主函数中的函数memmove((void*)str_0,(void*)str_1,4);函数名改过来没有?memmove是库函数,你自己的函数的名字是memmove_0,要改成你自己的函数的名字,不然当然进不了子函数的!


[解决办法]

int MoveMem(const void * const Src, void *Des, int n)
{
char *bySrc = (char *)Src;
char *byDes = (char *)Des;
for (int i = 0; i <n; i++)
{
byDes[n-i-1] = bySrc[n-i-1];
}
return 1;

}
[解决办法]
LZ,为什么要加这一句啊:
if( (dest_str> =(char*)src) || (src_str> =(char*)dest) )
return;

好象不对!
[解决办法]
程序在经编译器处理后可能将只是声明而未被使用的堆栈优化掉,最好是声明为静态数据区,或者堆申请,当然这只是我的猜测,你可以将这段代码反汇编看看结果!数组可能只是声明的指针,内存空间被优化掉了!!!

读书人网 >C语言

热点推荐