【问题标题】:Return an array in c在c中返回一个数组
【发布时间】:2011-01-25 20:13:05
【问题描述】:

我想知道是否有任何方法可以返回一个 char 数组。 我尝试了类似“char[] fun()”的方法,但出现错误。

我不想要指针解决方案。 谢谢!

【问题讨论】:

  • 指针解决方案正是您正在寻找的答案。请详细说明为什么这不合适。
  • 不要害怕pointer儿子。它很快就会成为你的朋友。 :)
  • 在内存数组中也是一个指针。所以你只能从函数中返回一个内存。如果您还返回数组,它将仅返回该数组的第一个位置。
  • 如果您不想使用指针,您选择了错误的 Kosta 语言。几乎所有 C 语言能做的很酷的事情都是指针。

标签: c arrays return


【解决方案1】:

数组不是 C 中的第一类对象,你必须通过指针来处理它们,如果数组是在你的函数中创建的,你还必须确保它在堆上并且调用者清理内存

【讨论】:

  • 我猜他是 C 新手,他可能不会理解第一类对象和堆 :)
  • 可能不是,但他们知道接下来要问/搜索什么答案!
【解决方案2】:

数组不能在 C 中按值传递或返回。

您需要接受一个指针和一个缓冲区大小来存储结果,或者您必须返回不同的类型,例如指针。前者通常是首选,但并不总是适合。

【讨论】:

    【解决方案3】:

    您可以通过将数组包装在结构中来返回一个数组:

    struct S {
       char a[100];
    };
    
    struct S f() {
        struct S s;
        strcpy( s.a, "foobar" );
        return s;
    }
    

    【讨论】:

    • 您缺少一个分号(和一个“t”)。
    • 您可以使用typedef struct S { char a[100] } T; 让生活更轻松,然后您可以写T 代替struct S
    • 这可以工作,但重要的是让发帖者意识到指针和数组在 C 中几乎是一回事
    【解决方案4】:

    C 函数不能返回数组类型。函数返回类型可以是“T 数组”或“函数返回 T”以外的任何类型。另请注意,您不能分配数组类型;即,以下代码将不起作用:

    int a[10];
    a = foo();
    

    C 中的数组与其他类型的处理方式不同;在大多数情况下,数组表达式的类型从“T 的 N 元素数组”隐式转换(“衰减”)到“指向 T 的指针”,并且其值被设置为指向数组中的第一个元素。此规则的例外情况是数组表达式是 sizeof 或地址 (&) 运算符的操作数,或者当表达式是用于在声明中初始化另一个数组的字符串文字时。

    鉴于声明

    T a[N];
    

    对于任何类型的 T,那么以下是正确的:

    表达式类型衰减到注释 ---------- ---- --------- ----- a T [N] T * 值是第一个元素的地址 &a T (*)[N] n/a 值是数组的地址(其中 是一样的地址 第一个元素,但类型是 不同的) sizeof a size_t n/a 数组中的字节数(字符)= N * sizeof(T) sizeof a[i] size_t n/a 单个元素的字节数 = 大小(T) a[i] T n/a 第 i 个元素的值 &a[i] T * n/a 第 i 个元素的地址

    由于隐式转换规则,当你将数组参数传递给函数时,函数接收的是指针值,而不是数组值:

    int a[10];
    ...
    foo(a);
    ...
    
    void foo(int *a)
    {
      // do something with a
    }
    

    还要注意做类似的事情

    int *foo(void)
    {
      int arr[N];
      ...
      return arr;
    }
    

    不起作用;一旦函数退出,数组arr 在技术上不再存在,并且它的内容可能在你有机会使用它之前被覆盖。

    如果您不是动态分配缓冲区,最好的办法是将要修改的数组作为参数传递给函数,以及它们的大小(因为函数只接收一个指针值,它无法判断数组有多大是):

    int a[10];
    init(a, sizeof a / sizeof a[0]);  // divide the total number of bytes in 
    ...                               // in the array by the number of bytes
    void init(int *a, size_t len)     // a single element to get the number
    {                                 // of elements
      size_t i;
      for (i = 0; i < len; i++)
        a[i] = i;
    }
    

    【讨论】:

      【解决方案5】:

      一个非常非常基础的代码和非常非常基础的解释 HOW TO Return 数组从用户定义的函数返回到主函数..希望它 有帮助!!下面我给出了完整的代码以使任何人都能理解 它究竟是如何工作的? :) :)

      #include<iostream>
      using namespace std;
      
      char * function_Random()
      {
          int i;
          char arr[2];
          char j=65;//an ascII value 65=A and 66=B
          cout<<"We are Inside FunctionRandom"<<endl;
          for(i=0;i<2;i++)
          {
              arr[i]=j++;// first arr[0]=65=A and then 66=B
              cout<<"\t"<<arr[i];
          }
          cout<<endl<<endl;
          return arr;
      }
      int main()
      {
      
          char *arrptr;
          arrptr=function_Random();
          cout<<"We are Inside Main"<<endl;
          for(int j=0;j<2;j++)
          {
              cout<<"\t"<<arrptr[j];
          }
          return 0;
      }
      

      【讨论】:

      • 程序有未定义的行为,您正在返回一个指向立即销毁的本地对象的指针,在main 中使用arrptr 是未定义的行为。
      猜你喜欢
      • 1970-01-01
      • 2016-11-20
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 2012-04-01
      相关资源
      最近更新 更多