【问题标题】:Can you cast the result of sizeof你能转换 sizeof 的结果吗
【发布时间】: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,所以投射它没有效果。如果这改变了程序行为,则表明程序有未定义的行为

标签: c++ sizeof


【解决方案1】:

是的,您可以转换sizeof 的结果,因为sizeof(something) 是编译时间,如果sizeof(something) 返回5,您将得到(size_t)5 类型的结果。

【讨论】:

    【解决方案2】:

    您的问题浓缩为“您可以将std::size_t 转换为另一种类型吗”。

    当然可以,但要遵守正常的类型转换规则。例如,将其转换为 int 可能会让您在 16 位 int 的系统上遇到非常大的类型。换句话说,检查新类型是否有足够的容量。

    如果您可以在 C++ 中编译时做到这一点,则可以额外加分。

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多