C程序返回数组

我正在开发一个非常基本的程序,我希望将一个长度为2的整数数组返回到我的主程序块。 我不能让它工作,我被告知我可能需要指针来做这件事。 指针如何工作,如何在我的程序中使用它? 这是我目前的代码:

int[] return2(); int main() { int a[2]; a = request(); printf("%d%d\n", a[0], a[1]); return(0); } int[] request () { int a[2]; a[0] = -1; a[1] = 8; return a; } 

  • 您不能声明返回数组的函数。

    ISO / IEC 9899:1999

    §6.9.1函数定义

    ¶3函数的返回类型应为void或数组类型以外的对象类型。

    C2011基本上会说同样的话。

  • 您不应该从函数返回指向(非静态)局部变量的指针,因为它在返回完成后不再在范围内(因此无效)。

如果数组是静态分配的,或者通过malloc()等动态分配数组,则可以返回指向数组开头的指针。

 int *function1(void) { static int a[2] = { -1, +1 }; return a; } static int b[2] = { -1, +1 }; int *function2(void) { return b; } /* The caller must free the pointer returned by function3() */ int *function3(void) { int *c = malloc(2 * sizeof(*c)); c[0] = -1; c[1] = +1; return c; } 

或者,如果您喜欢冒险,可以返回指向数组的指针:

 /* The caller must free the pointer returned by function4() */ int (*function4(void))[2] { int (*d)[2] = malloc(sizeof(*d)); (*d)[0] = -1; (*d)[1] = +1; return d; } 

小心那个function声明! 完全改变其含义并没有太大的改变:

 int (*function4(void))[2]; // Function returning pointer to array of two int int (*function5[2])(void); // Array of two pointers to functions returning int int (*function6(void)[2]); // Illegal: function returning array of two pointers to int int *function7(void)[2]; // Illegal: function returning array of two pointers to int 

你最好理解指针是如何工作的。 这是一个(坏)解决方案:

 #include  int* request(){ int a[2]; a[0] = -1; a[1] = 8; return a; } int main() { int* a; a = request(); printf("%d%d\n", a[0], a[1]); return 0; } 

但有一个问题。 因为int a[2]; in int* request()是一个局部变量,不能保证返回的值不会被覆盖。 这是一个更好的解决方案:

 #include  void request(int* a){ a[0] = -1; a[1] = 8; } int main() { int a[2]; request(a); printf("%d %d\n", a[0], a[1]); return 0; } 

您必须从函数返回pointer to array of 2 integers 。 #包括

 int(* request()) [2] { static int a[2]; a[0] = -1; a[1] = 8; return &a; } int main() { int (*a) [2]; a = request(); printf("%d%d\n", *(*a+0), *(*a+1)); return 0; } 

您在request声明的数组int a[2]仅在该函数的范围内有效,因此返回它不起作用,因为一旦main得到它,数组就不再有效。

如果你不理解指针,那么你将不得不真正了解正在发生的事情,但这里有一些代码会做你想要的:

 int* request(); int main() { int* a; // a is a pointer to an int a = request(); printf("%d%d\n", a[0], a[1]); // we have to tell the program that we're done with the array now free(a); return(0); } int* request () { // allocate space for 2 ints -- this space will survive after the function returns int* a = malloc(sizeof(int) * 2);/ a[0] = -1; a[1] = 8; return a; } 

您可以像其他人一样建议并通过malloc分配内存来返回指针。 您还应该考虑以下内容:

 struct values { int val1; int val2; }; struct values request(); int main() { struct values a; a = request(); printf("%d%d\n", a.val1, a.val2); return(0); } struct values request () { struct values vals; vals.val1 = -1; vals.val2 = 8; return vals; } 

结构按值传递和返回(意味着它们被复制),并且有时可以更容易和更安全,具体取决于结构中包含的数据类型。

要返回数组,必须动态分配它。

试试这个(观察变化):

 int* request(); int main() { int *a; a = (int *)request(); printf("%d %d\n", a[0], a[1]); return(0); } int* request() { int *a = malloc(sizeof(int) * 2); a[0] = -1; a[1] = 8; return a; }