在c中返回一个数组

Posted

技术标签:

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

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

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

【问题讨论】:

指针解决方案正是您正在寻找的答案。请详细说明为什么这不合适。 c-faq.com/~scs/cclass/int/sx5.html 不要害怕pointer儿子。它很快就会成为你的朋友。 :) 在内存数组中也是一个指针。所以你只能从函数中返回一个内存。如果您还返回数组,它将仅返回该数组的第一个位置。 如果您不想使用指针,您选择了错误的 Kosta 语言。几乎所有 C 语言能做的很酷的事情都是指针。 【参考方案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 是未定义的行为。

以上是关于在c中返回一个数组的主要内容,如果未能解决你的问题,请参考以下文章

C语言中函数调用怎么返回两个值

在c中返回一个数组

C语言子函数如何返回一个数组,主函数如何接收?

c语言如何返回一个数组?

如何在 C 中返回二维数组?

如何使用函数在 C 中返回二维数组?