我有一个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;
答案 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*
是最好的选择。
不可以,除非您测试delete
和sizeof (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;它们很复杂且难以正确处理,而弄错它们的症状就是“代码有效”,直到在编译器升级后它在随机位置随机中断。