从C函数返回数组

时间:2013-05-24 15:50:47

标签: c arrays string return

我正在试图弄清楚如何在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;
}

3 个答案:

答案 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;
}