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