void *memcpy(void *pvTo, const void *pvFrom, size_t size)
{
assert((pvTo != NULL) && (pvFrom != NULL)); // 使用断言
byte *pbTo = (byte *) pvTo; // 防止改变pvTo 的地址
byte *pbFrom = (byte *) pvFrom; // 防止改变pvFrom 的地址
while(size -- > 0 )
*pbTo ++ = *pbFrom ++ ;
return pvTo;
}
为什么说
byte *pbTo = (byte *) pvTo; // 防止改变pvTo 的地址
byte *pbFrom = (byte *) pvFrom; // 防止改变pvFrom 的地址
这样可以防止pvTo和pvFrom的地址被改变
那位大哥能帮忙解释一下
谢谢
因为pvTo和pvFrom要参与计算,它们的值会发生改变,如下面的语句所示:*pbTo ++ = *pbFrom ++ ;而memcpy要返回目标指针的地址,因此要通过byte *pbTo = (byte *) pvTo;保留pvTo的值。
来晚了,楼上正解.
因为在拷贝结束时,:*pbTo ++ = *pbFrom ++.........,pbTo和pbForm都指向了pvTo+size和pvFrom+size了.如果不用pvTo,就会出错了.
它只得是栈内的变量得到保护,不被改变,其实就是留个备份.
你看,return pvTo; 至少这个要保留下来啊.
while(size -- > 0 )
*pbTo ++ = *pbFrom ++ ;
return pvTo;
要使用pvTo返回拷贝内存后的地址,所以不能改变pvTo的值,
*pbTo ++ = *pbFrom ++ ;//只改变pbTo的值,没有改变pvTo的值
MARK
因为pvTo和pvFrom要参与计算,它们的值会发生改变,如下面的语句所示:*pbTo ++ = *pbFrom ++ ;而memcpy要返回目标指针的地址,因此要通过byte *pbTo = (byte *) pvTo;保留pvTo的值。
//还是不明白,,byte *pbTo = (byte *) pvTo<<有什么用?只是保留值?
MSDN:
byte:A byte data item does not undergo any conversion for transmission on the network as a char type might.
楼主好像是想知道这个...
//还是不明白,,byte *pbTo = (byte *) pvTo<<有什么用?只是保留值?
把无符号指针转化为字节指针,使指针自动加1或减一时,知道指针移动的尺寸,即指针移到下一个元素;