【发布时间】:2019-03-13 16:45:09
【问题描述】:
我想知道转换 sizeof 的结果是否有意义?
示例:
将sizeof(example) 更改为(size_t) sizeof(example)
返回类型是std::size_t,但我在许多函数(malloc、memset、...)中收到错误“无效的争论”,并且在强制转换后它可以工作。对printf 的快速检查告诉我,结果保持不变。
-编辑-
根据要求提供一个简短的示例函数:
__cxa_dependent_exception* __cxxabiv1:: __cxa_allocate_dependent_exception() throw()
{
__cxa_dependent_exception *ps_ret;
ps_ret = static_cast<__cxa_dependent_exception *> (o_exception_pool.allocate (
(size_t) sizeof(__cxa_dependent_exception )));
if (!ps_ret)
{
std::terminate ();
}
memset (ps_ret, 0, (size_t) sizeof(__cxa_dependent_exception ));
return ps_ret;
}
如果没有强制转换,此代码将引发上述错误。完整示例可在 gcc 4.5.4 源代码“libstdc++-v3/libsupc++/eh_alloc.cc”中找到
我正在使用 MinGW。
【问题讨论】:
-
我删除了 C 标签:这个问题在 C 中确实没有意义。
-
你能举一个最小的独立例子来说明为什么这是必要的吗?
-
@Brian
malloc(sizeof(t1))"returns invalid arguments" with cast 错误消失了。 -
您能否提供一个简短的完整程序来产生错误?
-
sizeof的结果是size_t,所以投射它没有效果。如果这改变了程序行为,则表明程序有未定义的行为