代码之家  ›  专栏  ›  技术社区  ›  Galaxy

如何将bool值保存到由void*指向的内存位置?

  •  0
  • Galaxy  · 技术社区  · 5 年前

    我有一个 void* lhs_value bool 我喜欢它。别问我为什么要那样。我认为这就像把指针指向 bool*

     error: expected '(' for function-style cast or type construction
                    *((*bool) lhs_value) = true;
    
    void* lhs_value;
    lhs_value = malloc( sizeof(int) );
    memset(lhs_value, 0, sizeof(int));
    *((*bool) lhs_value) = true;
    
    1 回复  |  直到 5 年前
        1
  •  4
  •   Ben Voigt    5 年前

    在C++中只有一种方法可以正确地键入双关语:

    #include <cstring>
    
    bool value = true;
    std::memcpy(lhs_value, &value, sizeof value);  // ::memcpy also ok
                                                   // in which case #include <string.h>
    

    联合不正确,指针强制转换也不正确(尽管指针强制转换将对直接从分配函数返回的指针起作用,但并不要求对所有指针都起作用) void*

    malloc 仅当您将指针传递给将调用 free() 在上面。否则使用一个合适的C++分配器 ::operator new() . lhs_value = new bool(true) 最棒的是,如果你能回到原来的类型( bool* )当使用 delete 不,你不应该混在一起 sizeof (bool) sizeof (int) 除非你测试它是足够的-- sizeof (char) == 1 总是,但不保证其他内置类型。不,你不需要打电话 memset .)

        2
  •  3
  •   Michi    5 年前
       *static_cast<bool*>(lhs_value) = true;
    

    注意 aliasing rules 在这样做之前,它们是复杂的,很难纠正,错误的症状是“代码正常工作”,直到它在编译器升级后以随机的方式在一个随机的位置中断。