Memcpy与memmove的思考

作者:ssLong  QQ:253651745
马上就要找工作了,正所谓“凡是预则立,不预则废”,所以希望趁着现在还比较清闲的时候复习一下,所学的知识,如C/C++、数据结构、数据库、操作系统等等。
同时也是因为前两天去面试,一道简单的程序都没写出来因此也是倍受打击,想恶补复习一下。
最主要的是,虽然通过初级程序员、软件设计师考试,但是发现很多简单基础的问题还是一头雾水,可能简单的程序不会有问题,毕竟也写过一些,如什么键盘记录器、C下的五子棋、模拟windows系统实现的功能、web开发、系统扫描、抓包程序等等。但是一涉及到基础较真的时候没有勇气说是与不是,都是可能大概也许或者,因为这些问题真的不能确定了。

所以我想复习一下所学知识,开始了选择的是宋劲杉老师编著的《Linux C编程一站式学习》,同时也是想通过复习,学习一下Linux开发,也是补充的一个方面吧。可以说这本书还是很不错的,出于复习的目的,可能看的稍微快些,毕竟有些知识还是懂的,因此几天后就已经看到最后了(但是觉得还有看一遍做总结的必要)。当看到24章memcpy与memmove的时候 我写下了本文。


为了练习这两个函数的用处做了一个小程序进行验证
#include <stdio.h>
#include <string.h>

Int main(void)
{
   Char buf[20] = “hello world\n”;
   Memcpy(buf + 1, buf , 13);
   Prinft(“%s”, buf);
   Return 0;
}

Memcpy就是将原指针开始的n个字符拷贝到目标指针开始的n的字节位置中,我笨想本程序的结果也是hhello world,但是世间事就是这么的复杂,让人难以琢磨,无法理解,无法预测,最后显示的结果却是hhhllooworrd这个结果真是让我诧异半天呀!怎么会是这样呢?真是百思不得其解。没有办法继续看书,原来是memcpy实现有问题,当然也是作者的猜测....

但是将memcpy改成memmove就可以得到预期的结果。最终的结论是memcpy的两个参数src和dest所指的内存区间如果重叠则无法保证正确拷贝,而mommove去可以正确拷贝。

唉,真是的调用C提供的函数都能出现问题,这个问题若是不在这里遇到,当我写的程序出现问题,我怎么都不会想到是memcpy出现了差错,由此也可见,编程是多么复杂的一件事情,有人就仿佛是破案,真的有点像呀。前两天也是,给海天写个网站显示的GridView分页功能,前面的复选框选中,但是程序中就是不能判定其选中的值,这问题让我苦思冥想了很多天,刚开始以为是程序写错了,其实这部分功能是从以前的一个功能模块中拷贝出来的,只是略加修改没有想到就是实现不了,终于有一天,不知道是多少个痛苦过后,我发现了问题所在,是因为程序在Page_load中进行的绑定GridView控件,这样当选中复选框,点击 按钮时,会重新执行Page_load函数,则重新进行了绑定,当然复选框中的值就没有了,呵呵,原来如此,当大功告成、发现问题的时候,欢喜是无以言表的,真是喜出望外,这个词好像也无法形容。这时体会的也是编程最大的乐趣,但同时此时的快乐也取决你前期的痛苦,前期痛苦的越深,那么此时快乐的越高,正所谓没有苦,就没有甜!

从一个还没有真正在公司编过程序的小学生角度来看编程,总是感觉它是那么深奥,可以让你痛苦不已,同时可以让你欣喜若狂。这些我也都经历过!但是我又能在这条路上走多远,也许...也许...只有在以后的以后才能有答案。

在此谨以此文告诫自己,如果我真的选择了这条路,那就要准备好风雨兼程....