2011-04-05 34 views
-2

因此,有我撞头了两晚在一排的一个问题:问题复制内存时

(tuple1和tuple2是空指针传递给这个函数)

char *data; 

data = (char*) calloc (76, 1); 
memcpy(data, tuple1, 32); 
memcpy(data+32, tuple2, 44); 

的想法是分配内存等于tuple1tuple2tuple1为32字节,tuple2为44)的大小之和,然后复制tuple1的32个字节并将它们粘贴到数据的地址,然后复制tuple2的44个字节并粘贴它们数据地址后的32个字节。

事情是,如果我只复制tuple1或只复制tuple2它真的被复制到应该是它的地方(我打印数据的方式太长的功能放在这里),但是当我做两个存储器复制第一个memcpy()工作正常,但第二个没有。

任何人都可以帮助我解决这个严重的问题吗?

+0

你描述应该有什么,由本身,工作。然而,为什么你没有显示的代码会导致它不能工作,有许多原因。请发布一个完整的程序,在编译和运行时显示问题;也描述它的作用,以及你期望它做什么。 – zwol 2011-04-05 15:56:52

+0

证明它。显示一个完整的程序,显示你描述的行为(当一个或另一个memcpy行被注释掉时)。希望在将真实代码缩减为该演示的过程中,您会注意到它突然再次开始工作时,会告诉您什么是错误的。 – 2011-04-05 15:57:44

+0

你怎么知道第二个副本不起作用?你有什么证据? – abelenky 2011-04-05 15:58:31

回答

1

我会怀疑对齐和/或填充问题,什么是tuple1tuple2的类型声明?

你怎么知道他们的确切尺寸?硬代码的代码是可疑的,应该使用sizeof而不是魔术数字文字。

而且,你不应该将返回值的calloc(),在C.

1

与更小的东西,哪一个更容易调试开始实验:

void* tuple1 = calloc(2, 1); 
char* content1 = "ab"; 
memcpy(tuple1, content1, 2); 

void* tuple2 = calloc(4, 1); 
char* content2 = "cdef";; 
memcpy(tuple2, content2, 4); 

char *data = data = (char*) calloc (6, 1); 
memcpy(data, tuple1, 2); 
memcpy(data+2, tuple2, 4); 

printf("%.*s\n", 6, data); // should print: abcdef 
+0

如果你打算假装某些数据是一个字符串,不要忘记说明null终止符的不存在。提示:使用'printf(“%。* s \ n”,6,data);' – pmg 2011-04-05 16:11:34

+0

好,谢谢。 – karlphillip 2011-04-05 16:15:22

+0

所以,我发现了一些有趣的东西。我已经分配了84个字节的数据。我正在做第一个内存复制memcpy(data,tuple1,44);它从tuple1的地址复制44个字节到数据的地址,当我尝试读取数据时,事实证明它已经复制了tuple1的字节在前44个字节的数据上,然后再次复制了tuple1的44个字节直到它填充了分配给数据的字节84字节。这是为什么?!我该如何预防它? – 2011-04-05 20:56:43