繁体   English   中英

从C函数返回数组

[英]Returning an array from a C function

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

func您将在此处返回指向局部变量的指针:

return &output;

离开函数后该函数将不存在,正如乔纳森指出的那样,您实际上正在返回一个指向char数组的指针,如果您想返回该指针,则只需完成return output但这仍然是错误的。

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

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

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

另一个问题是给定的:

char output[DIM];

类型:

return &output;

是“指向char数组的指针”,而不是char * 如果您写了:

return output;

您就可以了-如果您整理出返回值的持续时间。 同样,如果您将函数定义为返回指向数组的指针,则可以:

char (*func(char input[]))[]
{
    static char output[DIM];
    ...
    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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM