【问题标题】:what does this line of code "#define LIBINJECTION_SQLI_TOKEN_SIZE sizeof(((stoken_t*)(0))->val)" do?这行代码“#define LIBINJECTION_SQLI_TOKEN_SIZE sizeof(((stoken_t*)(0))->val)”是做什么的?
【发布时间】:2020-12-25 16:08:01
【问题描述】:

我特别想知道->val

sizeof(((stoken_t*)(0))->val)

以及stoken_t*(0) 指针的作用,尤其是(0) 的含义?

我希望我的问题已经足够清楚了。

【问题讨论】:

  • sizeof( (stoken_t){0}.val ) 可能更具可读性。做同样的事情。

标签: c pointers structure sizeof dereference


【解决方案1】:

这是一种在编译时访问结构成员的方法,无需定义该结构类型的变量。

(stoken_t*) 转换为0 的值模拟了该结构类型的指针,允许您在其上使用-> 运算符,就像您在该类型的指针变量上使用它一样.

补充一点,由于sizeof 是编译时运算符,表达式不会在运行时计算,因此与其他情况不同,这里不会发生空指针取消引用。

类似于

stoken_t * ptr;
sizeof(ptr->val);

【讨论】:

  • 通过编辑,我的回答是多余的,很好的解释。
  • 一般来说,取消引用 NULL 指针会导致未定义的行为。这是一个很好的定义,这有点令人惊讶。
  • @AugustKarlstrom:这里不是这种情况,因为 sizeof 不访问强制转换指针指向的内存。
  • @Peter 两个答案都很有用!因此,如果我理解正确,此代码会将可以是任何数字(例如 (7) )的数字文字转换为指针,以便访问变量并因此使用运算符 sizeof。所有这一切都是为了让它在编译时而不是在运行时工作(我必须研究一下这两种情况以及它是如何变化的)
  • @AugustKarlstrom 我以为我在答案中明确指出了这一点。
【解决方案2】:

详细说明:

(stoken_t*)(0) 简单地将0(这可以是任意数字文字)转换为指向stoken_t 的指针,((stoken_t*)(0)->val)stoken_tsizeofval 成员的类型返回此类型在内存中占用的字节数。简而言之,此表达式在编译时查找结构成员的大小,而不需要该结构类型的实例。

【讨论】:

    猜你喜欢
    • 2015-12-23
    • 2019-08-13
    • 2015-01-14
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多