【问题标题】:&(float){0} as a float* argument: what it means?&(float){0} 作为 float* 参数:这是什么意思?
【发布时间】:2020-07-10 11:22:16
【问题描述】:

&(float){0}

我在一些 C 代码中遇到过这种情况。它被指定为函数中的 float* 参数。什么意思?

【问题讨论】:

标签: c


【解决方案1】:

这是compound literal

foo(&(float){0})

的简写
float x = 0;
foo(&x);

它们之间的唯一区别是,使用复合文字时,无法在调用后访问该号码(如果 foo 更改它,这很重要)。

【讨论】:

  • 也就是说,&(float){0} 参数很可能是foo() 中缺少NULL 参数检查的解决方法:其效果是简单地丢弃foo() 决定写入的任何内容内存位置。
  • @cmaster-reinstatemonica 确实,它似乎与传递 NULL 有关。您能否详细说明一下,并添加为答案?
  • @Groo ... 除非foo() 将指针存储在某处作为副作用。当然,这将是疯狂的,因为复合字面量存在于堆栈中并且会 Poof!在其范围的末尾。但是,如果我学到了一件事,那就是:绝对没有什么疯狂到足以阻止它在某些生产代码中完成。
  • 当函数需要引用但我们想传递常量表达式时使用。这么小的工作。
  • @P__J__ 你没听懂我在说什么。我想说的是:如果输出参数的使用是可选的,这应该通过foo() 内的NULL 检查和显式传递foo(NULL) 的调用来实现。在这种情况下不使用复合文字。 foo(&(float){0}) 仅在以下情况下才需要:a)参数是可选的,b)foo() 没有这样的 NULL 检查,以及 c)无论出于何种原因,您都无法添加该检查。
【解决方案2】:

用于将常量表达式传递给期望引用的函数。

例子

float sq(float *f)
{
    *f = *f * *f;
    return *f;
}

int main(void)
{
    printf("%f\n", sq(&(float){3.0f}));
}

【讨论】:

    猜你喜欢
    • 2012-11-26
    • 2021-11-24
    • 1970-01-01
    • 2021-06-02
    • 2016-05-03
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多