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

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

本文关键字:rs gt ab comm 解释 sizeof      更新时间:2023-10-16

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

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的目的是什么?

代码片段:

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]);
}

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

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

现在,它使用 -> 运算符访问数据成员 ab.ab 必须定义为数组,这样它才能获得数组中的第一项。

因为,sizeof 并没有真正计算表达式,而只是弄清楚类型并获取它的大小。

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

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

如果你有一个rs_comm对象,即rs_comm rs;,但你不知道ab的类型,你想知道它的大小,sizeof(rs.ab[0])就可以了。

如果你有一个指向rs_comm的指针,即rs_comm *p_rs;,那么sizeof(p_rs->ab[0])也会做同样的事情。

如果您没有rs_comm 对象指向rs_comm的指针,则可以将NULL指针更改为指向rs_comm的指针,这就是((rs_comm *)0)执行的操作。

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

sizeof(variable) . 返回大小变量数据类型 。 喜欢 字符 x ; cout <<sizeof(x) ; 结果将是