【问题标题】:C program returning array [duplicate]C程序返回数组[重复]
【发布时间】:2013-03-12 03:54:57
【问题描述】:

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

【问题讨论】:

  • 对不起 - “请求”应该说 return2
  • 如果你想知道指针是如何工作的,何不试试谷歌搜索呢?
  • 是的,您需要了解指针。 stackoverflow.com/questions/897366/…
  • (1) 学习指针 (2) 如果您仍想将其作为 by-val 结果执行,则将结果内容填充到自定义结构中,您可以按值返回。那是你的电话。

标签: c


【解决方案1】:
  • 您不能声明返回数组的函数。

    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;
}

小心那个函数声明!完全改变它的含义并不需要太多改变:

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 :不知道静态可以在函数中使用。我以为它只能在类(C++)中使用。
  • 这是 C,不是 C++。我希望“不知道”真的是“不知道”,现在你知道了。事实上,你也可以在 C++ 中像这样(在函数内部)使用static
【解决方案2】:

您最好了解指针是如何工作的。这是一个(不好的)解决方案:

#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* request()中的int a[2];是一个局部变量,所以不能保证返回的值不会被覆盖。 这是一个更好的解决方案:

#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;
}

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

    • 你必须返回&amp;a,不是吗?而且您已经获得了指向本地(非静态)数组问题的指针...
    • 我似乎返回a 是对的。 a 已经是一个指针。编辑:经过测试。你最好返回a。返回 &amp;a 会生成编译器警告。
    • @CaralManic:你试过编译代码吗?名称a 是一个数组;当它在return a; 中使用时,它返回一个指向数组第一个元素的指针(在此上下文中为int *),这与指向数组的指针(int (*)[2])完全不同——即使地址返回,被视为void *,是相同的。
    • 没关系。我误读了代码。我以为是int* request()
    • @CaralManic ,这是我在编译上述程序错误时得到的错误:预期标识符或'(' before')' token
    【解决方案4】:

    您在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;
    }
    

    【讨论】:

      【解决方案5】:

      您可以按照其他人的建议进行操作,并通过 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;
      }
      

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

      【讨论】:

        【解决方案6】:

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

        试试这个(观察变化):

        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;
        }
        

        【讨论】:

        • 或者返回一个指向静态分配内存的指针...
        猜你喜欢
        • 2016-07-06
        • 2018-01-19
        • 2013-01-25
        • 2012-02-03
        • 1970-01-01
        • 2018-05-09
        • 2017-02-06
        相关资源
        最近更新 更多