我想知道是否有任何方法可以返回一个char数组。 我试过这样的“char [] fun()”,但我收到了错误。
我不想要指针解决方案。 谢谢!
答案 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;
}