2

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

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

4 回答 4

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
 }
}
于 2012-05-16T09:29:06.677 回答
3

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

当您将指针serv_con分配给 时app_data,它已经分配了一些空间。没有理由这样做:只需声明app_data为 achar *将指向分配的存储空间serv_con.

于 2012-05-16T09:27:53.940 回答
1

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

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

我建议最好的方法是传递一个输出参数,即传递您希望将结果作为参数复制到其中的数组。

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 返回的大小为 1024。这应该是一致的。我在上面的代码中都使用了 50 号。

于 2012-05-16T09:47:02.267 回答
0

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

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

始终查看警告。Greg已经回答了这个问题。

于 2012-05-16T09:54:05.553 回答