当前位置: 首页 > 知识库问答 >
问题:

为什么在调用memcpy bool值后memcpy to int不起作用

赵俊远
2023-03-14
// Simple struct containing 3 floats
struct vector
{
    float x;
    float y;
    float z;
};

// My test struct
struct test2
{
    float a;
    vector b;
    bool c;
    int d;
};

int main()
{
    // I create my structure on the heap here and assign values
    test2* test2ptr = new test2();
    test2ptr->a = 50;
    test2ptr->b.x = 100;
    test2ptr->b.y = 101;
    test2ptr->b.z = 102;
    test2ptr->c = true;
    test2ptr->d = 5;

    // Then turn the struct into an array of single bytes
    unsigned char* data = (unsigned char*)test2ptr;
    // Variable for keeping track of the offset
    unsigned int offset = 0;

    // Variables that I want the memory copied into they
    float a;
    vector b;
    bool c;
    int d;

    // I copy the memory here in the same order as it is defined in the struct
    std::memcpy(&a, data, sizeof(float));
    // Add the copied data size in bytes to the offset
    offset += sizeof(float);

    std::memcpy(&b, data + offset, sizeof(vector));
    offset += sizeof(vector);

    std::memcpy(&c, data + offset, sizeof(bool));
    offset += sizeof(bool);

    // It all works until here the results are the same as the ones I assigned
    // however the int value becomes 83886080 instead of 5
    // moving this above the bool memcpy (and moving the variable in the struct too) fixes the problem
    std::memcpy(&d, data + offset, sizeof(int));
    offset += sizeof(int);

    return 0;
}

共有1个答案

曹成双
2023-03-14

忽略数据在结构中的填充。

看看下面的简化示例:

struct X
{
    bool b;
    int i;
}; 

int main()
{
    X x;
    std::cout << "Address of b " << (void*)(&x.b) << std::endl;
    std::cout << "Address of i " << (void*)(&x.i) << std::endl;
}

这将在我的PC上产生:

如果在程序之前添加pragma pack(1),则输出为:

b 0x7FFD16C79CFB的地址

I0x7FFD16C79CFC的地址

 类似资料:
  • 问题内容: 我正在尝试从JSON网址获取集合。骨干网确实发送了请求并得到了响应,但是在它之后的集合中没有: 这是我的JavaScript: 响应中的JSON 响应中的Content-Type HTTP标头为。 为什么不将其加载到集合中?JSON是否正确? 一些更多的代码: 问题答案: 是异步的。尝试 要么 要么

  • 问题内容: 我有三部分字符串,每个部分用 符号分隔 。例如, 现在,当我使用这样的方法拆分它时: 它包含整个字符串作为单个元素的数组。 但是当我使用这个: 它完美的作品是什么,我想这意味着 现在的数组包含,并分别对指数0,1和2。 我想知道为什么第一次使用时不起作用,因为我在使用 问题答案: 因为字符是在正则表达式中用来标记行尾的保留令牌。因此,您必须使用进行 转义。

  • 问题内容: 我现在有点困惑。我尝试过: 并得到: 但是,我想要: 我的代码有什么问题? 问题答案: 您没有将其分配给。字符串是 不可变的 。 您需要将其分配回。

  • 问题内容: 我正在尝试这样做: 第一行有效: 但是接下来的两个: 和 只是输出 为什么? 问题答案: 因为你需要加入同,只是列出了内容直接,内容不具有完整路径。 范例- 如果未提供完整路径,则在当前目录中搜索,因此当您给出时,将获得正确的列表。 范例- 假设某个文件夹-具有文件-并在其中。 当您执行-时,返回的列表类似于- 即使您在其中提供绝对路径,列表中返回的文件也将具有指向目录的相对路径。您将

  • 我想知道两次当地约会之间的时间。我使用了下面的代码: 我有以下错误:

  • 我有一个用户和角色的存储库。两个实体在DB中有不同的表。我尝试加载像或相同的想法,但使用Spring数据与LoadGraph。但是当我调用时,我得到了异常。请帮我解决这个问题。谢谢你。 存储库: 例外: WARN: HHH000104: firstResult/max使用集合读取指定的结果;在内存中应用!Hibernate:选择不同的user0_. id作为id1_1_0_,role1_user_