在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中返回一个数组的主要内容,如果未能解决你的问题,请参考以下文章