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