memcpy函数原型为:void *memcpy(void *dest, const void *src, size_t n)
memcpy用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。在c中,很多时候都要用到这个函数,这是一个高效的函数。在使用的时候有几点需要注意:
1 这个函数不会检查参数dest与参数src所指向的数组(或其他类型)是否具有同样的空间。所以如果复制的字节数n超出了dest的空间容量,或者n超出src的容量,这个函数是不会进行判断的,这样就会很危险。这样,就需要程序员自己检查是否有溢出的情况出现。
2 很多时候,我们这样使用memcpy函数
memcpy((void *)dest,(void *)src,sizeof (src));
即将src的全部数据复制到dest中,但在如下情况下要注意sizeof(src)的值。
void testfun(const double * arr);
double
data[10] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0,10.0};
main(){
testfun(data); //见上面
}
void testfun(const double * arr)
{
// 值为4,因为这个arr是一个指针,sizeof计算的是"指针"这个类型所占的空间,而"指针"一直都只占4个字节
sizeof
(arr);
// 值为8,因为一个double类型占8个字节
sizeof (double );
double
arr_local[10]={ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0,10.0};
// 值为10*8=80,因为每个double类型占8个字节(在我电脑上),数组arr_local长度为10。这里的变量arr_local代表的是一个长度为10的数组,注意与arr比较
sizeof
(arr_local);
}
大家可以看到不同时候sizeof的不同表现,这样我们使用sizeof的时候就要留意下了。同样的在使用函数memcpy的时候,实参n的选择就要慎重点了。
c就是这样,要自己管理内存,一不小心就会出错。