从C中的函数返回数组时出错

时间:2018-07-02 12:38:23

标签: c arrays function

我有一个问题。

我无法编译程序。 这是一个非常简单的程序,它为变量分配一个数组,并将其作为参数传递给函数。现在,在返回此数组时,它将返回该数组。

现在,我遇到了这样的语法错误:

p2.c:3:4:错误:预期标识符或'['令牌前的'('  int [] lifo(int [] arr)

对于以下程序,我无法解决该错误:

this.userStream$ = this.displayEvent$.pipe(
      map(users => users
                .filter((user: UserModel) => !this.closedUsers.has(user))
                .slice(0, this.numberOfUsers))
      // flatMap((users: UserModel[]) => from(users))
      // // Don't include users we've previously closed.
      // , filter((user: UserModel) => !this.closedUsers.has(user))
      // , take(this.numberOfUsers)
      // , toArray()
      , tap(() => console.log('List updated!'))
      // Unless we explicitly want to recalculate the list of users, re-use the current result.
      , shareReplay(1));

3 个答案:

答案 0 :(得分:3)

在C语言中,无法从函数返回数组,并且也无法将其传递给函数。但是,让我们从这里开始:您在这里对数组的声明是错误的:

int[] lifo(int[] arr)

在C语言中,数组声明中的括号放在声明器的之后。因此,要编写一个接受并返回数组的函数,“正确”语法应如下所示:

int lifo(int arr[])[]

如果您尝试这样做,那么好的编译器会给您这样的错误:

  

错误:“ lifo”声明为函数,返回数组

只是不允许返回数组。

尽管如此,编译器并没有抱怨参数int arr[]:这是由于函数参数的特殊规则-如果它们具有数组类型,则会自动将它们调整为指针类型。因此,以下函数声明完全相同:

void lifo(int arr[]);
void lifo(int *arr);

您不能传递或返回数组。但是语法使函数看起来看起来像是一个数组-相反,它使用了指向该数组第一个元素的指针。

答案 1 :(得分:1)

  

lifo(int[] arr)

将其转换为:

lifo( int * arr )

lifo( int arr[] )

请注意,即使第二个变量也将传递 pointer (指针),而不是传递数组。 (对于一个,您将无法通过sizeof()来确定元素的数量。)您仍然可以在arr上使用索引访问,但是您可以在 any 上使用它。 em>指针。

对于返回值,请使用int *。毕竟,这就是您要返回的内容–另一个指针,而不是数组。

(您的功能lifo当然是非操作性的...我想这仅是出于示例的缘故。)

答案 2 :(得分:1)

在C语言中,您始终按其地址(例如其开头)传递数组。为此,您必须使用指针。这意味着您的函数定义无效。看起来应该像这样:

int* lifo(int* arr)
{
   return arr; 
}

但是此实现没有任何意义,因为输出指向与输入相同的位置。请参阅向您解释如何在C中处理数组的书。