C语言函数转Java memcpy函数实现用Java哪个来代替?看下面我的例子:

       需要类似C  memcpy函数实现的Java数组复制方法网上一查,Java只有System.arraycopyclone等方法,对二维数组都只能复制其一维数组的引用改这个那个也变了,蛋疼转为一维数组又貌似有点麻烦。而類似memcpy的功能没有具体的实现只好试着写一个,貌似效率较低。


-- JNI标准规范: 遵守JNI标准规函数命名方式, JNI中方法命名为 Java_包名_类名_方法名 , 可以使用javah生成签名头文件, 靠这种方式实现 Native方法 与 JNI方法之间的映射关系, 即应用直接与框架层进行交互, 这种规范常用与应用开发;

-- 函数注册规范 : 这是Android自定义的一种规范, 应用框架层采用该规范, 即应用框架层 与 框架层 进行交互, 底层源码开发多使用该规范;

昨天自己动手实现memcpy这个函数用┅个例程试了一下,结果正确满心欢心,可是有些地方想不明白于是百度了一下,结果自己写的函数简直无法直视

觉得还是写个总結,以示教训

我这个程序只能是在非常理想的条件下才能完成复制任务,一旦参数有误那么就会运行出错;另外没有返回值,而是直接将dest指针作为了返回型参数

另一点需要注意:在函数体中我另外声明了两个指针,分别指向dest和src我是这样想的:由于循环中要移动指针,为了不影响主程序中实参指针的位置所以我认为需要重新定义两个指针。后来我发现我这样想是错误的,指针变量实质上也是变量指针作为形参,那么这个指针也是实实在在存在的那么在函数中改变这个形参指针的位置并不会影响主程序中实参指针的位置。所以茬这个函数中没必要重新声明两个指针,最好是在返回值中返回一个指向dest的指针就够了

我会犯上述这个错误,应该是受了“地址传参”和“值传参”的影响由于地址传参太过于强调函数可以改变主程序中的数据内容,以至于让我把形参指针和实参指针等同起来了实質上形参指针变量位置的改变并不会影响实参指针的位置。

自己总结该函数的几个要点:

1、参数判断:对参数的合法性进行判断

2、声明中間变量:由于要返回目的指针所以需要保留目的首地址;最好是不要破坏形参,设置临时变量替换

3、void *类型:要注意dest和src的类型可能不同進而造成dest++ src++不匹配的问题,先强制类型转换

4、void 类型做右值:void类型变量或是返回值为void类型的函数一旦做右值编译出错

5、指针形参:即上面提箌的,指针变量本质仍是指针形参指针位置的改变不会影响实参指针的位置

下面是参考网友的一些总结,红色字体为本人批注:

memcpy实现内存拷贝,根据这个问题,我们可以提取出下面几点:

我要回帖

更多关于 memcpy函数 的文章

 

随机推荐