这是有效的C代码吗?

时间:2016-02-18 18:06:22

标签: c

这就是我想要的,但我不记得以前在任何地方看过它,并且想知道它是否是未定义的行为或是否正确。我指的是如何将短片传递给f()。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void f(short *s)
{
   printf("%d\n",s[0]);
}

int main(int argc, char *argv[])
{
    f((short[5]){0,1,1,1,1});
}

3 个答案:

答案 0 :(得分:10)

是的,这是有效的。该结构称为复合文字,并在C99中引入。与任何其他文字一样,它只是一种创建临时数组的方法,例如传递给本例中的函数,而不实际创建变量。

答案 1 :(得分:6)

这是一种称为“复合文字”的特殊语法,自C99起允许使用。它在C11 standard, section 6.5.2.5

中讨论

答案 2 :(得分:1)

(short[5]){0,1,1,1,1}array 5 of short类型的复合文字。

当一个数组传递给一个函数时,它被转换为第一个元素的地址,在这种情况下是short *类型。

由于匹配f(short *s),因此s获取该地址的副本,不再需要转换。