解释sizeof(((rs_comm *)0) - > ab [0]);

时间:2018-03-28 15:04:10

标签: c++

xdn-project/digitalnote ./src/crypto/crypto.cpp文件中,编译时第338行出现错误(使用cmake):

return sizeof(rs_comm) + pubs_count * sizeof(rs_comm().ab[0]);
                                                     ^
  

错误:不完整类型的值初始化   '加密:: rs_comm :: []'

我在cryptonotefoundation/cryptonote找到了解决方案:

return sizeof(rs_comm) + pubs_count * sizeof(((rs_comm*)0)->ab[0]);

我可以很好地使用Java JDK,但目前在C ++中需要帮助:)很高兴看到这段代码的详细说明:

sizeof(((rs_comm*)0)->ab[0]);

我的问题是:

  1. rs_comm之后的星号 - 它的用途是什么?
  2. 0) - 这里0的目的是什么?
  3. 代码片段:

      struct rs_comm {
        Hash h;
        struct {
          EllipticCurvePoint a, b;
        } ab[];
      };
    
      static inline size_t rs_comm_size(size_t pubs_count) {
        return sizeof(rs_comm) + pubs_count * sizeof(rs_comm().ab[0]);
    }
    

3 个答案:

答案 0 :(得分:1)

sizeof是一个返回特定类型大小的运算符。它可以直接使用类型或表达式。

这部分(rs_comm *)0取0(0是有效的空指针常量)并将其转换为struct rs_comm的指针(或类,我不知道rs_comm的定义,但是我猜。)

现在,它正在使用 - >进行访问操作员到数据成员ab。 ab必须定义为数组,因此它可以获取数组中的第一项。

因为,sizeof并没有真正评估表达式,只是弄清楚它的类型并获得它的大小。

因此,最终结果是类/ struct rs_comm的数组ab中第一个元素的大小。

答案 1 :(得分:1)

所以ab是struct rs_comm的成员,是一个数组。

如果你有一个 rs_comm对象,即rs_comm rs;,但你不知道ab的类型,你想知道它的大小,{{ 1}}会做的。

如果您有指向rs_comm的指针,即sizeof(rs.ab[0]),那么rs_comm *p_rs;将执行相同的操作。

如果您没有 rs_comm对象指向rs_comm 的指针,则可以将一个空指针更改为指向rs_comm 的指针,这是sizeof(p_rs->ab[0])所做的。

((rs_comm *)0)中的p_rs替换为sizeof(p_rs->ab[0]),获得((rs_comm *)0)

答案 2 :(得分:0)

sizeof(变量)。 返回size变量数据类型。 喜欢 char x; cout<< sizeof(x); 结果将是