在c中返回一个数组

时间:2010-03-10 10:25:36

标签: c arrays return

我想知道是否有任何方法可以返回一个char数组。 我试过这样的“char [] fun()”,但我收到了错误。

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

5 个答案:

答案 0 :(得分:11)

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

struct S {
   char a[100];
};

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

答案 1 :(得分:5)

无法通过C中的值传递或返回数组。

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

答案 2 :(得分:4)

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

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

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

鉴于声明

T a[N];

对于任何类型T,则以下为真:

Expression     Type      Decays to      Notes
----------     ----      ---------      -----
         a     T [N]     T *            Value is address of first element
        &a     T (*)[N]  n/a            Value is address of array (which
                                          is the same as the address of the
                                          first element, but the types are
                                          different)
  sizeof a     size_t    n/a            Number of bytes (chars) in array = 
                                          N * sizeof(T)
sizeof a[i]    size_t    n/a            Number of bytes in single element = 
                                          sizeof(T)
       a[i]    T         n/a            Value of i'th element
      &a[i]    T *       n/a            Address of i'th element

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:-1)

  

非常非常基本的代码和非常基本的解释如何返回   数组从用户定义的函数返回到main函数。希望它   帮助!下面我给出了完整的代码,让任何人都能理解   它是如何工作的? :):)

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