在C语言中返回一个数组

4

我想知道是否有办法返回一个字符数组。 我尝试了这样的方式 "char[] fun()",但是出现了错误。

我不希望得到指针的解决方案。 谢谢!


7
指针解决方案恰好是您要寻找的答案。请说明为什么这不合适。 - sleske
6
不要害怕指针,孩子。它很快就会成为你的朋友。 :) - N 1.1
1
在内存中,数组也是指针。因此您可以从函数中返回一个内存地址。如果您想要返回整个数组的话,它将会返回该数组的第一个元素。 - sganesh
1
如果你不想使用指针,那么你选择了错误的语言,Kosta。C语言可以做的很酷的事情几乎都需要用到指针。 - Thanos Papathanasiou
这似乎是一个毫无意义的问题,为什么不使用指针呢?按照定义,数组只是在分配的内存区域开头的指针... - Julien Leray
显示剩余3条评论
5个回答

11

你可以将数组包装在结构体中返回:

struct S {
   char a[100];
};

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

你漏掉了一个分号(还有一个 't')。 - Bertrand Marron
2
你可以通过使用 typedef struct S { char a[100] } T; 来简化生活,然后在代码中可以直接使用 T 代替 struct S - user257111
1
这是可行的,但发帖者需要意识到,在C语言中指针和数组基本上是相同的东西。 - jsn

5

在C语言中,数组不能通过值传递或返回。

你需要接受一个指针和一个缓冲区大小来存储结果,或者返回一个不同的类型,例如指针。前者通常更可取,但并不总是适用。


4

C语言函数无法返回数组类型。函数返回类型可以是除“T的数组”或“返回T的函数”之外的任何东西。另请注意,您不能分配数组类型;也就是说,像以下代码这样的代码将不起作用:

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

在C语言中,数组与其他类型的处理方式不同。在大多数情况下,数组表达式的类型会被隐式转换(“衰减”)为“指向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            单个元素的字节数 = sizeof(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;
}

3

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


我猜他对C语言还不太熟悉,可能不太理解一级对象和堆的概念 :) - N 1.1
可能不是,但他们会知道下一个要问/搜索的答案! - jk.

-1
一个非常基本的代码和非常基本的说明,如何从用户定义的函数返回数组到主函数。希望它有所帮助!下面我给出了完整的代码,让任何人都能理解它是如何工作的? :) :)
#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;
}

1
程序存在未定义行为,您正在返回一个指向本地对象的指针,该对象会立即被销毁,任何在“main”中使用“arrptr”的操作都是未定义行为。 - David Rodríguez - dribeas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接