【问题标题】:Returning an array from a C function从 C 函数返回一个数组
【发布时间】:2023-04-08 05:10:01
【问题描述】:

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

【问题讨论】:

  • 您正在返回函数本地数组的地址,该地址不存在于函数范围之外。
  • printf("输出: %s", func(input));也许用指针格式改变它: printf("output: %p", func(input));既然你得到了一个指针就可以做到。

标签: c arrays string return


【解决方案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;
}

【讨论】:

  • 请释放()你分配的内存!否则你就是在教一个坏习惯。
  • 并在使用空指针之前检查malloc() 调用是否成功,并检查fgets() 是否成功...此外,在这种情况下,我认为简单得多在main() 函数中声明char input[DIM];char output[DIM];。在这里动态内存分配确实没有任何好处,除非 DIM 是如此巨大(数兆字节)以至于它会破坏堆栈。
【解决方案2】:

func 中,您在此处返回一个指向局部变量的指针:

return &output;

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

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

【讨论】:

  • 这是在向我们介绍动态分配之前需要进行的练习的一部分。我认为这个练习是错误的,除非你将数组作为参数传递,否则没有办法(没有动态分配)。对吗?
  • 你也可以取消对第一个元素的引用并引用这个地址,看起来很讨厌,但也可以。像这样 &(output[0])
  • 您也可以将数组设为全局数组,尽管标准做法是传入输出数组
  • 或者让它静态化。
【解决方案3】:

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

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

另一个问题是:

char output[DIM];

类型:

return &output;

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

return output;

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

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

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

【讨论】:

    猜你喜欢
    • 2014-09-16
    • 1970-01-01
    • 2021-10-01
    • 2012-04-01
    • 2011-06-23
    • 2021-12-30
    • 2023-01-18
    • 2019-09-06
    • 1970-01-01
    相关资源
    最近更新 更多