请教 memcpy 到底拷贝了什么?

gisqimeng 2011-09-08 12:24:54
函数原形为:
void *memcpy(void *dest, const void *src, int c, size_t n);

看到网上的解释多为:
memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的地址上。

为了理解这个函数。我写了如下几行代码,可还是理解不到位:

char* a = "abcdefghigklmnopqrstuvwxyz_abcdefghigklmnopqrstuvwxyz_";
char* b = NULL;

int size = sizeof(b);
memcpy(&b, &a, size);

a = "10";


//size的值为4,通过memcpy的拷贝后,a的所有的值都被赋给了b。而不是只有4个字节!!
//是不是可以理解为memcpy把a的地址给了b呢?但这样明显又是不对了,因为下面给a
//重新赋值后,b的值又是不变的。这又如何理解呢?memcpy到底是怎样拷贝的呢?
//有什么特殊的机制吗? 请高手指点。。。
...全文
369 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xu20110220 2011-09-09
  • 打赏
  • 举报
回复
适当的时候去搜源码看,很有好处,PS.看stl源码剖析很有意思哦
ljhhh0123 2011-09-09
  • 打赏
  • 举报
回复
1楼真是一针见血。
gisqimeng 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]
int size = sizeof(b);
memcpy(&b, &a, size);

你这个用法就相当于

b = a,指针赋值而已
[/Quote]

如果这样说的话,a和b指向的是同一块内存空间了.a和b有一个值被改变时另一也就被改变了?
便我这样赋值后 a = "10"; b的值还是原来的值哦,并无改变!这又如何解释呢?

孤舟 2011-09-09
  • 打赏
  • 举报
回复
LZ你的memcpy能通过编译么~?
programer.M 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 alweeq86 的回复:]

我想你最初想的应该是这样的
char* a = "abcdefghigklmnopqrstuvwxyz_abcdefghigklmnopqrstuvwxyz_";
char b[100] = {0};
int size = strlen(a);
memcpy(b,a, size);
cout<<b;
[/Quote]

建议楼主看看7楼这个例子,大家说的都不错。a就是一个指针,不需要再加&,加了反而错了,还有就是,指针申明是最好分配内存空间。
辰岡墨竹 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gisqimeng 的回复:]

引用 1 楼 jackyjkchen 的回复:
int size = sizeof(b);
memcpy(&amp;b, &amp;a, size);

你这个用法就相当于

b = a,指针赋值而已


如果这样说的话,a和b指向的是同一块内存空间了.a和b有一个值被改变时另一也就被改变了?
便我这样赋值后 a = "10"; b的值还是原来的值哦,并无改变……
[/Quote]
字符串赋值得用strcpy,或者用*a='1'之类的。a="10",其实是把a又指向了另外一个字符串常量。
再说常量也是不允许修改的,要测试可以用数组。
char a[]="abcdefg";
char *b = a;
strcpy(a, "123");
*(b+3)='x';
printf("%s", a);

ouen333 2011-09-09
  • 打赏
  • 举报
回复
memcpy 你的本意和你实际运用的不符, 你实际运用的是把a的地址赋值给指向b地址的指针(指针的大小都是4)
delphiwcdj 2011-09-08
  • 打赏
  • 举报
回复
区别&b存储的是字符串地址,b是字符串内容
delphiwcdj 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]

char* a = "abcdefghigklmnopqrstuvwxyz_abcdefghigklmnopqrstuvwxyz_";
char* b = NULL;

int size = sizeof(b);
memcpy(&b, &a, size);

你这个用法就相当于

b = a,指针赋值而已

然后你那些疑问不都可以解释了么?
[/Quote]
正解

char* a = "abcdefghigklmnopqrstuvwxyz_abcdefghigklmnopqrstuvwxyz_";
char b[5] = {0};

int size = sizeof(b);
memcpy(b, a, size-1);
cout << b << endl;
__GUNS_N_ROSES__ 2011-09-08
  • 打赏
  • 举报
回复
memcpy(&b, &a, size);

....再回去好好看看文档和应用示例?这里面没有特别神奇的东西啊。
http://www.cplusplus.com/reference/
jackyjkchen 2011-09-08
  • 打赏
  • 举报
回复
char* a = "abcdefghigklmnopqrstuvwxyz_abcdefghigklmnopqrstuvwxyz_";
char* b = NULL;

int size = sizeof(b);
memcpy(&b, &a, size);

你这个用法就相当于

b = a,指针赋值而已

然后你那些疑问不都可以解释了么?
hslinux 2011-09-08
  • 打赏
  • 举报
回复
君恪 2011-09-08
  • 打赏
  • 举报
回复

memcpy(&b, &a, size);

你把a的地址拷贝到了存放b地址的内存上了
alweeq86 2011-09-08
  • 打赏
  • 举报
回复
我想你最初想的应该是这样的
char* a = "abcdefghigklmnopqrstuvwxyz_abcdefghigklmnopqrstuvwxyz_";
char b[100] = {0};
int size = strlen(a);
memcpy(b,a, size);
cout<<b;
alweeq86 2011-09-08
  • 打赏
  • 举报
回复
int size = sizeof(b);
memcpy(&b, &a, size);
这里把a指向的字串地址给了b b和a指向同样的地址
赵4老师 2011-09-08
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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