void *memcpy(void *dest,const void *src,size_t count);的问题

shihaojie1219 2011-01-23 10:40:18
看到一本书上有段话是这样说的:
“当使用memcpy这个函数把比如CString等一些类型的数据从变量考入到内存时,函数仅仅保存指向这些数据的指针。如果将这些类型的数据从内存拷贝到剪贴板上时,实质上就是将内存中存放的关于数据的指针(即地址)拷入到了剪贴板上,从而剪贴板上保存的只是指向这些数据类型的指针。。。。”
鄙人不才,没有搞懂作者的意思,按照作者的说法,不宜把CString类型的数据拷到剪贴板上,是因为这样memcpy保存的是指向这些数据的指针。我想问一下为什么是指针呢?dest指向的内存里不就是拷贝的cstring变量的内容吗?
...全文
372 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2011-01-24
  • 打赏
  • 举报
回复
自己写个例子验证一下
bai_hua_lin 2011-01-24
  • 打赏
  • 举报
回复
如果你是先把CString转换为LPCTSTR或者LPTSTR,再调用这个函数,应当不会有问题才对。如果你直接把CString转换为void *,就应该会有问题。
向立天 2011-01-24
  • 打赏
  • 举报
回复
你这是哪本书看的
有没有什么上下文
单看这段是有问题的
真相重于对错 2011-01-24
  • 打赏
  • 举报
回复
CString 之类的class 最好不要用memcpy
memcpy 是 按字节拷贝
类似于CString 一般
这样实现(伪码)
class CString
{
w_char* m_pszData;//指向原始的字符串位置,具体还要看项目编码设置
public:
CString(w_char* temp)
{
m_pszData=temp;
}
~CString()
{
if(m_pszData)
delete m_pszData;
}
}
如果
CString A= "foo";
CString B;
memcpy(&B,&A,A.getlength());
当A 离开了作用域 那段地址就会被删除,同时B也会无效
做鸡真好吃 2011-01-24
  • 打赏
  • 举报
回复
书上是错的。当然需要看你怎么试验的,如何转换
这里可能需要思考两个问题:
1.LPCTSTR和char*,还有常量指针和指针常量
2.深拷贝问题(当然memcpy这里没什么问题)
renxu350 2011-01-23
  • 打赏
  • 举报
回复
CString类不是诸如char数组一类的基本类型,所以是指针
C/C++面试之算法系列--几个典型的内存拷贝及字符串函数实现 写一个函数,完成内存之间的拷贝。[考虑问题是否全面,是否考虑内存重叠问题] 返回void *支持链式操作,参数类型是void *以支持任意类型的指针,输入参数加上const修饰,最好加上assert对输入输出指针进行非NULL判断 void* memcpy( void *dest, const void *src, size_t count ) { char* pdest = static_cast( dest ); const char* psrc = static_cast<const char*>( src ); // 依次从前拷贝,目的地址覆盖了源地址的数,此时从后往前拷贝 if( (pdest>psrc) && (pdest<(psrc+count))) //能考虑到这种情况就行了 { for( size_t i=count-1; i!=-1; --i ) pdest[i] = psrc[i]; } else { for( size_t i=0; i<count; ++i ) pdest[i] = psrc[i]; } return dest; } int main( void ) { char str[] = "0123456789"; memcpy( str+1, str+0, 9 ); cout << str << endl; memcpy( str, str+5, 5 ); cout << str << endl; system( "Pause" ); return 0; // 0012345678 // 4567845678 } strcmp(): Int simple_strcmp (const char *s1, const char *s2) { int ret; while ((ret = *(unsigned char *) s1 - *(unsigned char *) s2++) == 0 && *s1++); return ret; } memcmp(): int simple_memcmp (const char *s1, const char *s2, size_t n) { int ret = 0; while (n--&& (ret = *(unsigned char *) s1++ - *(unsigned char *) s2++) == 0); return ret; } strcmp只判断s1的‘/0’,没有长度的控制;memcmp有长度参数n的控制 memcpy(): char *simple_memcpy (char *dst, const char *src, size_t n) { char *ret = dst; while (n--) *dst++ = *src++; return ret; } 直接的内存之间的copy,不处理内存重叠的情况。 strcpy(): char *simple_strcpy (char *dst, const char *src) { char *ret = dst; while ((*dst++ = *src++) != '\0'); //相当简约,一句话即搞定 return ret; } 与memcpy区别就是对'\0'作为结束符 strncpy(): char *simple_strncpy (char *dst, const char *src, size_t n) { char *ret = dst; while (n--) { if ((*dst++ = *src++) == '\0') { while (n--) *dst++ = '\0'; return ret; } } return ret; } n和‘\0'都作为结束的控制符。如果n过大,则后面全补'\0'

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧