我正在试图弄清楚如何在C中返回数组。这就是代码。我要做的是保存一个数组,然后使用函数返回打印它。我在这里做错了什么?
#include <stdio.h>
#define DIM 50
char *func (char input[]);
int main(void)
{
char input[DIM];
printf("input? ");
fgets(input, DIM, stdin);
printf("output: %s", func(input));
return 0;
}
char *func(char input[])
{
int i;
char output[DIM];
for(i = 0; i < DIM; i++)
output[i] = input[i];
return &output;
}
答案 0 :(得分:1)
在func
中,您将返回一个指向本地变量的指针:
return &output;
离开函数后,将不存在,正如Jonathan指出的那样,如果你想返回刚刚完成的指针,你实际上正在返回一个指向char
数组的指针{{1}但那仍然是错的。
如果你不能使用动态分配,那么你需要将输出作为参数传递。
答案 1 :(得分:1)
其他答案已经说明了一个问题:
另一个问题是:
char output[DIM];
类型:
return &output;
是指向char
'数组的指针,而不是char *
。如果你写了:
return output;
你没问题 - 如果你整理了返回值的持续时间。类似地,如果您将函数定义为返回指向数组的指针,那么您就可以了:
char (*func(char input[]))[]
{
static char output[DIM];
...
return &output;
}
请注意,使用静态变量会使函数不可重入(在线程应用程序中使用不安全),除非数组实际上是常量(在这种情况下,定义应该说它是常量)。
答案 2 :(得分:1)
可以返回地址,但不是那样。
试试这个
char *func(char input[])
{
int i;
char *output = (char*)malloc(sizeof(char) * DIM);
for(i = 0; i < DIM; i++)
output[i] = input[i];
return output;
}
另一种方法就是“按引用呼叫”。 看起来像这样
void func(char *input, char *output)
{
int i;
for(i = 0; i < DIM; i++)
output[i] = input[i];
}
你的主要应该是这样的
int main()
{
char *input = (char*)malloc(sizeof(char) * DIM);
char *output = (char*)malloc(sizeof(char) * DIM);
printf("input? ");
fgets(input, DIM, stdin);
func(input, output);
printf("output: %s", output);
free(input);
free(output); // after you finished your work with this variable
return 0;
}