首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个memmove函数解决思路

2012-02-27 
一个memmove函数写了一个函数好像不是很对各位大虾指点#includestdio.h#includestring.hvoidmemmove_0

一个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;

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

热点排行