这就是我想要的,但我不记得以前在任何地方看过它,并且想知道它是否是未定义的行为或是否正确。我指的是如何将短片传递给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});
}
答案 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
获取该地址的副本,不再需要转换。