我需要一个函数来返回一个字符串。我使用以下代码来声明函数:
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。提前谢谢。
答案 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回答。