我想知道是否有办法返回一个字符数组。 我尝试了这样的方式 "char[] fun()",但是出现了错误。
我不希望得到指针的解决方案。 谢谢!
我想知道是否有办法返回一个字符数组。 我尝试了这样的方式 "char[] fun()",但是出现了错误。
我不希望得到指针的解决方案。 谢谢!
你可以将数组包装在结构体中返回:
struct S {
char a[100];
};
struct S f() {
struct S s;
strcpy( s.a, "foobar" );
return s;
}
typedef struct S { char a[100] } T;
来简化生活,然后在代码中可以直接使用 T
代替 struct S
。 - user257111在C语言中,数组不能通过值传递或返回。
你需要接受一个指针和一个缓冲区大小来存储结果,或者返回一个不同的类型,例如指针。前者通常更可取,但并不总是适用。
C语言函数无法返回数组类型。函数返回类型可以是除“T的数组”或“返回T的函数”之外的任何东西。另请注意,您不能分配数组类型;也就是说,像以下代码这样的代码将不起作用:
int a[10];
a = foo();
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;
}
在C语言中,数组不是一等对象,你需要通过指针来处理它们。如果数组是在你的函数中创建的,你还需要确保它在堆上,并且调用者清理内存。
#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;
}