1

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

3 回答 3

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;
}
于 2013-05-24T16:04:23.527 回答
1

func您在这里返回一个指向局部变量的指针:

return &output;

一旦你离开函数,它就不会存在,正如乔纳森指出的那样,你实际上是在返回一个指向数组的指针char,如果你想返回你刚刚完成的指针,return output但这仍然是错误的。

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

于 2013-05-24T15:52:13.947 回答
1

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

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

另一个问题是:

char output[DIM];

类型:

return &output;

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

return output;

你会没事的——如果你整理出返回值的持续时间。同样,如果您将函数定义为返回指向数组的指针,则没问题:

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

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

于 2013-05-24T15:56:19.110 回答