【问题标题】:Problem when copying memory复制内存时出现问题
【发布时间】:2011-07-30 02:38:51
【问题描述】:

所以有一个问题我连续两个晚上都在头疼:

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

char *data;

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

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

问题是,如果我只复制tuple1 或只复制tuple2,它确实被复制到了它应该在的地方(我打印的数据太长了,无法放在这里),但是当我做这两个内存时复制第一个 memcpy() 可以正常工作,但第二个不行。

谁能帮我解决这个严重的问题?

【问题讨论】:

  • 您所描述的内容本身应该有效。但是,您未显示的代码可能导致其无法工作的原因有很多。请发布一个完整的程序,在编译和运行时显示问题;还要描述它的作用以及您期望它做什么。
  • 证明它。显示一个完整的程序,显示您描述的行为(当一个或另一个 memcpy 行被注释掉时)。希望在将您的真实代码缩减为该演示的过程中,您会注意到它何时突然重新开始工作,这会告诉您出了什么问题。
  • 你怎么知道第二个副本不起作用?你有什么证据?
  • 这是什么平台?在 x86 以外的其他东西上,对齐问题肯定会发挥作用。
  • 我敢打赌打印有错误的数据的代码。如果 tuple1 和 tuple2 都是指针,那么你的代码应该复制内存。

标签: c memcpy


【解决方案1】:

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

你怎么知道它们的确切尺寸?对事物进行硬编码的代码值得怀疑,应该使用sizeof 而不是幻数文字。

另外,您不应该在 C 中转换 calloc() 的返回值。

【讨论】:

    【解决方案2】:

    从更小、更容易调试的东西开始你的实验:

    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
    

    【讨论】:

    • 如果你要假装一些数据是一个字符串,不要忘记考虑空终止符的不存在。提示:使用printf("%.*s\n", 6, data);
    • 所以,我发现了一些有趣的东西。我为数据分配了 84 个字节。我正在做第一个内存复制 memcpy(data, tuple1, 44);它将 tuple1 的地址中的 44 个字节复制到数据的地址,当我尝试读取数据时,结果发现它已将 tuple1 的字节复制到数据的前 44 个字节上,然后再次复制了 tuple1 的 44 个字节直到它填满了为数据分配的 84 个字节。这是为什么?!我该如何预防?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多