【问题标题】:How can I use memcpy to copy data from two integers to an array of characters?如何使用 memcpy 将数据从两个整数复制到字符数组?
【发布时间】:2012-04-11 21:45:58
【问题描述】:

我有一个最多可以存储 8 字节数据的文件。

我有一个系统(我们称之为 Sys1),它可以从文件中获取 8 个字节并将其保存在内存中的缓冲区中。

我可以使用这 8 个字节并在其中复制一些内容,然后使用这个系统说“好的,我完成了,只需将这些数据发送回文件”。

我想将 8 个字节带入缓冲区,将一个整数复制到其中,这需要 4 个字节,然后在剩余的 4 个字节上复制另一个整数。我只想要 8 个字节的两个整数,我相信这是可以做到的。

我只复制了 4 个字节,这只是 1 个整数,并设法将其发送回文件。所以我有这样的事情:

     char *data;
     sys1.bring_the_8_bytes(&data);
    //now the 8 bytes are in the buffer,
    // data points to the first byte of the 8 byte  sequence
    int firstInteger = 10;
    int secondInteger = 20;
    //the two integers 
    memcpy(data,&firstInteger,sizeof(int));
    //now the values of the first integer have been copied successfully.
    sys1.send_the_8_bytes_back();

现在这工作正常!但是我不确定如何复制第一个整数,然后立即复制第二个。

我实际上应该知道第一个整数所取的最后一个字节之后的第一个字节的地址,然后在 memcpy 调用中将此地址用作目标地址,我的想法是否正确?如果是的话,

我怎样才能做到这一点?我怎样才能找到我想要的这个地址?

提前致谢

【问题讨论】:

    标签: c++ memcpy


    【解决方案1】:

    您在计算时遇到问题的地址只是sizeof(int) 超过您已有的数据指针的字节。您可以将 char* 转换为 int* 并使用它,因为您知道您始终有一个有效的 8 字节区域可以写入。

    char *data;
    sys1.bring_the_8_bytes(&data);
    int *tmp = (int*)data;
    tmp[0] = 10;
    tmp[1] = 20;
    

    或者您可以添加到char*(添加sizeof(int))然后再添加一个memcpy

    【讨论】:

    • 哦,这到底是什么 +1 :) 我比我更喜欢你的回答。
    • tmp[0] = 10; tmp[1] = 20; 可能是写最后两行的更清晰的方式。
    • 这是未定义的行为,是严格的别名违规。
    • @FrançoisAndrieux:你说得对,我可能应该解决这个问题
    【解决方案2】:

    你在追求这样的事情吗?

    memcpy(data + sizeof(int), &secondInteger, sizeof(int));
    

    【讨论】:

      【解决方案3】:

      如果您不介意数组并想在一次调用中完成,我建议您将两个整数复制到一个 int 数组中,然后写入文件。

      【讨论】:

      • 如果您没有注意到通过bring_the_8_bytesdata 指针)返回的内存被写入然后通过调用send_the_8_bytes_back() 提交,那么分配新内存不会不行。
      猜你喜欢
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多