读书人

memcpy 的疑惑

发布时间: 2013-10-27 15:21:50 作者: rapoo

memcpy 的不解
我看了一篇博文:
C语言实现 vector( 动态数组) 改进版
地址:http://blog.csdn.net/dengxu11/article/details/7311820

有一点不明白,在下面代码中

int cvector_pushback(const cvector cv, void *memb)  
{
if (cv->cv_len >= cv->cv_tot_len)
{
void *pd_sav = cv->cv_pdata;
cv->cv_tot_len <<= EXPANED_VAL;
cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);

if (!cv->cv_pdata)
{
cv->cv_pdata = pd_sav;
cv->cv_tot_len >>= EXPANED_VAL;
return CVEPUSHBACK;
}
}
//把memeb中的数据复制到cv_pdata的后面。从memeb拷贝cv_size个字节到cv_pdata的最后。
memcpy((char *)cv->cv_pdata + cv->cv_len * cv->cv_size, memb, cv->cv_size);
cv->cv_len++;
return CVESUCCESS;
}


对于memcpy((char *)cv->cv_pdata + cv->cv_len * cv->cv_size, memb, cv->cv_size);
为什么(char*)不能够换成(int *)或(double *)或其它类型? memcpy c语言 vector
[解决办法]
因为char是 1 byte, 指针+1时向后偏移的是1 byte, 可以一个一个字节拷贝
如果转换成int*指针, 这样在计算大小的时候指针向后偏移是4byte, 算出来的大小如果是byte的话,需要除以4以对应指针的步长, 拷贝的时候是按照4byte为单位.

拷贝内存时肯定是按照byte为单位最合适, 而不是4byte或者多个byte

[解决办法]
举了例子,假如原指针p的值为1(指向地址为1的空间),现在要向它后边3个位置的地方赋值内容,那么需要把指针位置后移3位,那就是(char*)p+3,也就是memcpy(p+3 , xxx ,xxx);如果使用了int*或者其他来代替char*,那么就是(int*)p+3,此时指针指向的不是p后移3位的位置而是3*4=12的位置,因为一个int通常占4个字节,而char是1

读书人网 >C语言

热点推荐