1

我正在开发一个非常基本的程序,我想将一个长度为 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;
}
4

6 回答 6

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

    ISO/IEC 9899:1999

    §6.9.1 函数定义

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

    C2011 基本上会说同样的话。

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

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

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
于 2013-03-12T04:05:32.653 回答
3

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;
}
于 2013-03-12T04:09:57.640 回答
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];inint* 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;
}
于 2013-03-12T04:05:04.570 回答
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;
}
于 2013-03-12T04:08:15.790 回答
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;
}

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

于 2013-03-12T07:00:34.863 回答
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;
}
于 2013-03-12T04:05:30.680 回答