如果可能的话:
#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");
}
答案 0 :(得分:4)
你没有返回int,但是你要返回数组。这与&myIntArray[0]
的值相同。 int ReturningArray()[]
不是有效的函数原型。
答案 1 :(得分:2)
此代码存在一些问题。
您将括号放在错误的位置。而不是
int ReturningArray()[]
应该是
int* ReturningArray()
您正在返回一个局部变量。局部变量仅在执行函数期间存在,之后将被删除。
为了完成这项工作,你必须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;
}