为什么这个数组符号在C中是非法的?

时间:2011-12-10 11:16:41

标签: c arrays return

如果可能的话:

#include <stdio.h>
#include <process.h>

#define SIZE 5

void PassingArray(int arr[])
{
    int i=0;
    for(i=0 ; i<SIZE ; i++)
    {
        printf("%d, ", arr[i]);
    }
    printf("\n");
}

main()
{
    int myIntArray[5] = {1, 2, 3, 4, 5};

    PassingArray(myIntArray);

    system("PAUSE");
}

那么为什么以下是非法的?

#include <stdio.h>
#include <process.h>

#define SIZE 5

int ReturningArray()[]
{
    int myIntArray[5] = {1, 2, 3, 4, 5};

    return myIntArray;
}

main()
{
    int myArray[] = ReturningArray();

    system("PAUSE");
}

5 个答案:

答案 0 :(得分:4)

你没有返回int,但是你要返回数组。这与&myIntArray[0]的值相同。 int ReturningArray()[]不是有效的函数原型。

答案 1 :(得分:2)

此代码存在一些问题。

  1. 您将括号放在错误的位置。而不是

    int ReturningArray()[]
    

    应该是

    int* ReturningArray()
    
  2. 您正在返回一个局部变量。局部变量仅在执行函数期间存在,之后将被删除。

  3. 为了完成这项工作,你必须malloc int数组并返回指向数组的指针:

    #include <stdio.h>
    #include <malloc.h>
    
    #define SIZE 5
    
    int* ReturningArray()
    {
        int *myIntArray = (int *)malloc(SIZE * sizeof(int));
        myIntArray[0] = 1;
        myIntArray[1] = 2;
        myIntArray[2] = 3;
        myIntArray[3] = 4;
        myIntArray[4] = 5;
        return myIntArray;
    }
    
    int main(void)
    {
            int i;
            int* myArray = ReturningArray();
            for(i=0;i<SIZE;i++) { 
                    printf("%d\n", myArray[i]); 
            }
            free(myArray); // free the memory again
            system("PAUSE");
            return 0;
    }
    

答案 2 :(得分:2)

PassingArray是合法的,但它不传递数组。它传递一个指向数组第一个元素的指针。 void PassingArray(int arr[])void PassingArray(int *arr)的混淆同义词。您无法在C中按值传递数组。

不允许使用

ReturningArray,也不能在C中按值返回数组。通常的解决方法是返回包含数组的结构:

typedef struct ReturnArray {
    int contents[5];
} ReturnArray;

ReturnArray ReturningArray()
{
    ReturnArray x = {{1, 2, 3, 4, 5}};
    return x;
}

数组是C语言中的二等公民,事实上它们不能通过值传递或返回,这在历史上与它们不能通过赋值复制这一事实有关。据我所知,其原因很明显在C的早期开发中,早在标准化之前,还没有确定数组是如何工作的。

答案 3 :(得分:2)

为什么这不起作用有多种原因。

第一种只是它被语言禁止 - 函数的返回类型不应该是一个数组(它也不能是一个函数)。

第二个是,即使你 允许像你一样声明ReturningArray,你也永远不能在该函数中写一个有效的return语句 - 带数组的表达式不是一元&sizeof运算符主语的类型求值为指向数组的第一个元素的指针,该元素不再具有数组类型。因此,您无法让return看到数组。

第三,即使我们以某种方式返回一个数组类型的函数,你也不能使用该返回值作为数组变量的初始化 - 返回值将再次计算为指向第一个元素的指针数组:在这种情况下,指向int的指针和指向int的指针不适合int数组的初始化。

答案 4 :(得分:0)

您不能从函数返回数组,但您可以声明一个函数返回一个(C ++中的引用)或指向数组的指针,如下所示:

int myIntArray[] = {1, 2, 3, 4, 5};

int (*ReturningArray())[sizeof(myIntArray)/sizeof(int)] {

    return &myIntArray;
}