问个内存拷贝的问题memcpy****************************************************

god_sun 2009-03-04 03:51:45
一个 string aa= "A";
我要按四个字节的长度的拷贝到另一个内存里去

char test[123]= "";
memcpy(test,aa, 4);


question 1:
那么test里应该是,0x00,0x00,0x00,0x65,对吗?

question 2:
如果 aa = "";
那么内存里是不是 0x00,0x00,0x00,0x00?
是不是就等于 unsigned int bb = 0;
memcpy (test, &bb, 4);
...全文
208 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lb0lblb 2009-03-05
  • 打赏
  • 举报
回复
1、test里面一定不是0x00,0x00,0x00,0x65,因为你的memcpy拷贝的是aa的内容加上aa后面的内存中存储的内容,如果按照你解释的aa是char类型的话,那么aa只有2个字节,aa后面的内容不确定,test里面前2个字节是0x65,0x00,后面2个字节的内容不确定
2、你的aa没指定类型,所以不能确定到底有几个字节,如果是char aa="",那么aa本身只有1个字节,里面存储的是'\0'
  • 打赏
  • 举报
回复
你对string类做memeset处理,结果建议自己运行看看吧.
class A a;
a[0]是什么,楼主,你能告诉我吗?
BeckhamXiao 2009-03-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 god_sun 的回复:]
可能是我写错了。
应该是 char aa[]== "A";
memcpy(test,aa, 4);
test 应该是 0x41,0x00,0x00,0x00


其实我更想知道的是问题2

[/Quote]

这两个问题的回答都是对。初始化就是0x00,0x00,0x00,0x00,C语言能够保证这一点
yangch_nhcmo 2009-03-04
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

int main()
{
string aa = "";
char test[123] = "";
memcpy(test,aa.c_str(),4);
printf("-------string aa = \"\" -------\n");
for (int i = 0; i < 4 ; i ++)
printf("test[%d] : 0x%d\n",i,test[i]);


unsigned int bb = 0;
char test1[123] = "";
memcpy(test1,&bb,4);

printf("-----unsigned int bb = 0-----\n");
for (int i = 0; i < 4 ; i ++)
printf("test1[%d] : 0x%d\n",i,test1[i]);

return 0;
}



[Cheney@Fedora 0903]$ g++ -g -o test_1 test_1.cpp
[Cheney@Fedora 0903]$ ./test_1
-------string aa = "" -------
test[0] : 0x0
test[1] : 0x0
test[2] : 0x0
test[3] : 0x0
-----unsigned int bb = 0-----
test1[0] : 0x0
test1[1] : 0x0
test1[2] : 0x0
test1[3] : 0x0
yangch_nhcmo 2009-03-04
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

int main()
{
string aa = "A";

char test[123] = "";
memcpy(test,aa.c_str(),4);

for (int i = 0; i < 4 ; i ++)
printf("test[%d] : 0x%d\n",i,test[i]);

return 0;
}



[Cheney@Fedora 0903]$ g++ -g -o test test.cpp
[Cheney@Fedora 0903]$ ./test
test[0] : 0x65
test[1] : 0x0
test[2] : 0x0
test[3] : 0x0
traceless 2009-03-04
  • 打赏
  • 举报
回复
是的,看代码,输出结果
int main(void)
{
char *str = "A";
char test[4]= "";
printf("%#x,%#x,%#x,%#x\n",test[0],test[1],test[2],test[3]);
memcpy(test,str,4);
printf("%c,%#x,%#x,%#x\n",test[0],test[1],test[2],test[3]);
return 0;
}
piginthetree 2009-03-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 god_sun 的帖子:]
一个 string aa= "A";
我要按四个字节的长度的拷贝到另一个内存里去

char test[123]= "";
memcpy(test,aa, 4);

question 2:
如果 aa = "";
那么内存里是不是 0x00,0x00,0x00,0x00?
是不是就等于 unsigned int bb = 0;
memcpy (test, &bb, 4);
[/Quote]
楼主为什么不自己写代码测试一下呢?
如果char aa[]= ""的话, aa就只占1个字节的内存, 里面的数据是0x00, memcpy(test, aa, 4)的话, 会把aa和aa后面3个字节的数据都拷贝到test里面, 这样test[0]=0x00, test[2~3]的值都是未定义的哦, 谁也不知道会得到什么, 跟memcpy(test, &bb, 4)的结果就算相同也是巧合.
god_sun 2009-03-04
  • 打赏
  • 举报
回复
可能是我写错了。
应该是 char aa[]== "A";
memcpy(test,aa, 4);
test 应该是 0x41,0x00,0x00,0x00


其实我更想知道的是问题2
arong1234 2009-03-04
  • 打赏
  • 举报
回复
test的类型是char[],因此没有高字节在后的问题,所以0x00 0x00 0x00 0x65即使在aa指向"A"
时也不对

况且,aa的地址不指向"A",而是string类内部某个数据结构(依赖编译器也依赖string自己定义)
可以当作规则:用字节拷贝来对付一个类对象永远是不对的

[Quote=引用楼主 god_sun 的帖子:]
一个 string aa= "A";
我要按四个字节的长度的拷贝到另一个内存里去

char test[123]= "";
memcpy(test,aa, 4);


question 1:
那么test里应该是,0x00,0x00,0x00,0x65,对吗?

question 2:
如果 aa = "";
那么内存里是不是 0x00,0x00,0x00,0x00?
是不是就等于 unsigned int bb = 0;
memcpy (test, &bb, 4);
[/Quote]
OenAuth.Core 2009-03-04
  • 打赏
  • 举报
回复
question 1:
那么test里应该是,0x00,0x00,0x00,0x65,对吗?

如果是Intel的话,那就错啦,因为Intel的高字节在后面,低的在前面

question 2:
如果 aa = "";
那么内存里是不是 0x00,0x00,0x00,0x00?




是不是就等于 unsigned int bb = 0;
memcpy (test, &bb, 4);

应该是这样
xiaoyuer5222 2009-03-04
  • 打赏
  • 举报
回复
是不是就等于 unsigned int bb = 0;
memcpy (test, &bb, 4);

这是不行的,第二个参数是字符串,是要以 字符串结束符 结束的
OenAuth.Core 2009-03-04
  • 打赏
  • 举报
回复
直接把你的代码放VC里,看一下memory不就知道了。

69,377

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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