我正在开发一个非常基本的程序,我希望将一个长度为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;
}
答案 0 :(得分:6)
您无法声明返回数组的函数。
ISO / IEC 9899:1999
§6.9.1函数定义
¶3函数的返回类型应为
void
或数组类型以外的对象类型。
C2011基本上会说同样的事情。
您不应该从函数返回指向(非静态)局部变量的指针,因为一旦返回完成它就不再在范围内(因此无效)。
< / LI>如果数组是静态分配的,或者通过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;
}
小心那个功能声明!完全改变其含义并没有太大的改变:
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
答案 1 :(得分:3)
您最好了解指针是如何工作的。这是一个(坏)解决方案:
#include <stdio.h>
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];
中的int* request()
是局部变量,因此无法保证不会覆盖返回的值。
这是一个更好的解决方案:
#include <stdio.h>
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;
}
答案 2 :(得分:3)
您必须从函数返回pointer to array of 2 integers
。
#include
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;
}
答案 3 :(得分:1)
您在int a[2]
中声明的数组request
仅在该函数的范围内有效,因此返回它不起作用,因为一旦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;
}
答案 4 :(得分:1)
您可以像其他人一样建议并通过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;
}
结构按值传递和返回(意味着它们被复制),有时可以更容易,更安全,具体取决于结构中包含的数据类型。
答案 5 :(得分:0)
要返回数组,必须动态分配它。
请改为尝试(观察更改):
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;
}