从C函数返回数组

我想弄清楚如何在C中返回一个数组。这就是代码。 我要做的是保存一个数组,然后使用函数返回打印它。 我在这做错了什么?

#include  #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; } 

其他答案已经说明了一个问题:

  • 从函数返回本地(非静态)变量的地址是不安全的。

另一个问题是:

 char output[DIM]; 

类型:

 return &output; 

是’指向char数组的指针’而不是char * 。 如果你写道:

 return output; 

你会没事的 – 如果你整理了返回值的持续时间。 类似地,如果您将函数定义为返回指向数组的指针,那么您可以正常:

 char (*func(char input[]))[] { static char output[DIM]; ... return &output; } 

请注意,使用静态变量会使函数不可重入(在线程应用程序中使用不安全),除非数组实际上是常量(在这种情况下,定义应该说它是常量)。

func您将返回一个指向局部变量的指针:

 return &output; 

一旦你离开函数就不存在,正如Jonathan指出的那样,你实际上是在返回一个指向char数组的指针,如果你想返回指针,你刚刚做了return output但那仍然是错误的。

如果您不能使用动态分配,那么您需要将输出作为参数传递。

可以返回地址,但不是那样。

试试这个

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