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

从C中的函数返回数组时出错,c,arrays,function,C,Arrays,Function,我有个问题 我无法编译我的程序。 这是一个非常简单的程序,它将数组赋值给变量,并将其作为参数传递到函数中。现在返回此数组时,它将返回数组 现在,我面临一个语法错误,如下所示: p2.c:3:4:错误:应为标识符或“[”标记之前的“” int[]lifoint[]arr 我无法解决以下程序的错误: #include<stdio.h> int[] lifo(int[] arr) { return arr; } int main() { int arr1[100],ar

我有个问题

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

现在,我面临一个语法错误,如下所示:

p2.c:3:4:错误:应为标识符或“[”标记之前的“” int[]lifoint[]arr

我无法解决以下程序的错误:

#include<stdio.h>

int[] lifo(int[] arr)
{
    return arr;
}

int main()
{
    int arr1[100],arr2[100],arr[100];
    int arr1_size,arr2_size,arr_size,i;
    printf("Enter size of array1: \n");
    scanf("%d",&arr1_size);
    printf("Enter size of array2: \n");
    scanf("%d",&arr2_size);
    printf("Enter elements of array1: \n");
    for(i=0;i<arr1_size;i++)
    {
        scanf("%d",&arr1[i]);
    }
    printf("Enter elements of array2: \n");
    for(i=0;i<arr2_size;i++)
    {
        scanf("%d",&arr2[i]);
    }
    printf("Combining 2 arrays: \n");
    arr_size=arr1_size+arr2_size;
    arr=lifo(arr1);
    for(i=0;i<arr1_size;i++)
    {
        printf("%d\n",arr[i]);
    }
    return 0;
}
提升点

将此转化为:

lifo( int * arr )

请注意,即使是第二个变量也将传递指针,而不是数组。首先,您将无法通过sizeof确定元素的数量。您仍然可以在arr上使用索引访问,但可以在任何指针上使用索引访问

至于返回值,请使用int*。毕竟,它是您将返回的内容—另一个指针,而不是数组


当然,您的函数lifo是一个非op函数。我假设这只是为了举例说明。

在C中,您总是按地址传递数组,例如数组的开头。要这样做,您必须使用指针。这意味着您的函数定义无效。它应该如下所示:

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

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

在C中,数组不能从函数返回,也不能传递给函数。但让我们从以下内容开始:数组的声明是这里错了:

int[] lifo(int[] arr)
在C语言中,数组声明中的方括号位于声明符之后。因此,要编写一个接受并返回数组的函数,正确的语法如下所示:

int lifo(int arr[])[]
如果您尝试此操作,一个好的编译器会给您以下错误:

int lifo(int arr[])[]
错误:“lifo”声明为返回数组的函数

它只是不允许返回数组


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

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

您不能传递或返回数组。但语法允许函数看起来像是接受数组,而是接受指向此数组第一个元素的指针。

您不能返回数组。您可以返回数组上的指针,但:int*lifoint arr[]。在您的情况下,不要返回任何内容,因为函数可能正在工作。C中没有数组参数,C中没有数组返回,并且地球不平坦,int*lifoint*arr{return arr;}也就是int[]arr是无效的C。这是Java吗?@TrishantPahwa如果你已经知道了,为什么要问?为了完整起见,你甚至不能传递数组…语法看起来可以工作,因为函数参数的类型被调整了,数组类型变成了指针类型。另外,永远不要使用scanf读取用户输入。尤其是在没有检查其类型的情况下返回值。scanf用于读取格式化输入,已知良好的格式化内容,理想情况下由您自己的程序使用printf早期编写。它在从输入错误中恢复、提供有意义的错误消息等方面非常糟糕;使用FGET读取整行内容,然后解析它们。您不知道是否确实读取了值并正在调用如果您没有,则正在初始化UB。编译器不会抱怨参数int[]然而,委员会什么时候会停止这种无意义的行为,我的C17在哪里?我也不喜欢这种类型调整规则,它会混淆代码……但是有更糟糕的历史事件需要最终禁止,而不是仅仅废除它们——好吧,有些人甚至喜欢类型调整,认为可以表达其意图函数参数应该指向数组…但是这个实现没有任何意义,因为输出指向与输入相同的位置。这是一个返回参数指针的公用idom。例如,请参阅每个str*函数。@Stargateur:str*函数在返回一个m、 虽然…@DevSolar好吧,你的后进先出函数,当然,是一个非操作函数…我假设这只是为了举例;