如何将布尔值保存到void *指向的存储位置?

时间:2019-06-01 22:32:16

标签: c++ pointers type-punning

我有一个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;

2 个答案:

答案 0 :(得分:2)

只有一种方法可以在C ++中正确键入pun:

#include <cstring>

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

联合不正确且指针强制转换也不正确(尽管指针强制转换将对直接从分配函数返回的指针起作用,但不需要对所有有效的内存中的void*值进行操作)。 / p>

(是的,您应该预先分配内存。仅在将指针传递到将在其上调用malloc的C库的情况下使用free()。否则,请使用{ {1}}。如果您使用::operator new()运算符可以回退到原始类型(lhs_value = new bool(true)),那么bool*是最好的选择。 不可以,除非您测试deletesizeof (bool)是足够的,否则不应该将sizeof (int)sizeof (char) == 1混合使用-始终memset,但不能保证其他内置类型。不,您不需要致电var $el = $("#very-specific-design"); var elHeight = $el.outerHeight(); var elWidth = $el.outerWidth(); var $wrapper = $("#scaleable-wrapper"); // invisible wrapper is doing the resizing, so .ui-resizable-se corresponds to it... how could I limit its movement? currently, it's moving in respect to said wrapper. $wrapper.resizable({ resize: doResize }); function doResize(event, ui) { var scale; scale = Math.min( ui.size.width / elWidth, ui.size.height / elHeight ); $el.css({ transform: "translate(-50%, -50%) " + "scale(" + scale + ")" }); } var starterData = { size: { width: $wrapper.width(), height: $wrapper.height() } } doResize(null, starterData); 。)

答案 1 :(得分:1)

   *static_cast<bool*>(lhs_value) = true;

在执行此操作之前,请注意aliasing rules;它们很复杂且难以正确处理,而弄错它们的症状就是“代码有效”,直到在编译器升级后它在随机位置随机中断。