函数,字符串作为C中的返回类型

时间:2012-05-16 09:19:14

标签: c function return-type

我需要一个函数来返回一个字符串。我使用以下代码来声明函数:

const char* serv_con(char app_data[50])
{
    char send_data[1024],recv_data[1024];
    //i am avoiding code segments irrelevant to the issue.
    return recv_data;
}

然后像这样调用main中的函数:

int main()
{
    char ser_data[50], app_data[50];
    ser_data[0] = '\0';
    app_data[0] = '\0';
    //avoiding code segments irrelevant to the issue.
    app_data = serv_con(ser_data); //function call
}

编译时会出现错误:

connect.c:109: error: incompatible types when assigning to type ‘char[50]’ from type ‘const char *’

然后我用std :: string替换声明中的 const char 。声明现在如下:

std::string serv_con(char app_data[50])
{
    char send_data[1024],recv_data[1024];
    //avoiding code segments irrelevant to the issue.
    return recv_data;
}

并以与上述相同的方式调用它。但是它仍然在编译时出现以下错误:

connect.c:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token

请告诉我如何从函数中将字符串作为返回类型。我工作的平台是linux。提前谢谢。

4 个答案:

答案 0 :(得分:9)

const char* serv_con(char app_data[50])
{
  char send_data[1024],recv_data[1024];
  //i am avoiding code segments irrelevant to the issue.
  return recv_data;
}

这不起作用,因为您返回一个指向局部变量的指针,该指针在返回后无效。您需要在堆上分配recv_data以便在返回

后使用它
char* serv_con(char app_data[50])
{
  char send_data[1024];
  char *recv_data = malloc(1024);
  if (!recv_data)
      return NULL;

  // ...
  return recv_data;
 }

然后将主要功能更改为

int main()
{
 char ser_data[50];
 char *app_data;
 ser_data[0] = '\0';
 //avoiding code segments irrelevant to the issue.
 app_data = serv_con(ser_data); //function call
 if (!app_data) {
   // error
 }
}

答案 1 :(得分:3)

你在做什么是一个非常糟糕的主意。 serv_con函数在堆栈上为recv_data数组分配一些空间,然后返回指向该位置的指针。当然,只要你调用另一个函数就会消除数据,导致一个难以诊断的错误。如果必须从函数返回一块内存,请使用malloc进行分配。基本上,永远不要返回指向堆栈上对象的指针。

当您从serv_con中取出指针时,将其指定给已分配了一些空间的app_data。没有理由这样做:只需将app_data声明为char *即可指向serv_con中分配的存储空间。

答案 2 :(得分:1)

返回指向本地数组或数组本身的指针是一个坏主意。

即使你在函数内部执行malloc,调用者也需要释放内存,这也不是一个很好的做法。

我建议最好的方法是传递一个out参数,即传递要将结果复制为参数的数组。

int serv_con(char app_data[50], char recv_data[50])
{
    char send_data[1024];
     //recv_data[1024];
    //i am avoiding code segments irrelevant to the issue.
    return 1; // return status success or failure which can be tested in main
}

然后像这样调用main中的函数:

int main()
{
    char ser_data[50], app_data[50];
    ser_data[0] = '\0';
    app_data[0] = '\0';
    //avoiding code segments irrelevant to the issue.

    serv_con(ser_data, app_data); //function call
}

我发现并纠正了一个小错误。您在main中传递的app_data大小为50,而您尝试从函数serv_con返回的app_data为1024.这应该是一致的。我在上面的代码中使用了50个大小。

答案 3 :(得分:0)

从你的问题我可以肯定你是一个初学者。请阅读一本好的教科书,The C Programming Language

除了错误,你必须得到这个。
warning:函数返回局部变量的地址。

始终查看警告。问题已由Greg回答。