2012-05-16 34 views
2

我需要一个函数来返回一个字符串。我用下面的代码声明函数:带字符串作为返回类型的函数C

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; 
} 

然后叫这样的主要功能:

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。提前致谢。

+1

这不是C++。不要标记它C++。 –

+0

你为什么使用const?这意味着值不能被修改。而你仍然试图在代码中的某处修改它。 – Milee

+1

我避开了'const',并尝试了'char *',但它仍然给出了相同的错误。 –

回答

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 
} 
} 
+0

但我最初需要字符串'app_data'为空。我怎样才能做到这一点? –

+0

它不会包含任何数据,并且在调用'serv_con()'之前将无效。如果您之前需要使用'app_data',则在调用'serv_con()'之前,您可能需要一个额外的变量来存储'serv_con()'的返回值或仅释放'app_data'。 – dwalter

+0

我照你说的完成了。现在所有的错误都消失了,但是我仍然得到这个警告:'connect.c:107:warning:assignment丢弃指针目标类型的限定符。如果这是一个问题? –

3

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

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

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 
} 

然后叫主这样的功能:

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.这应该是一致的。我已经在上面的代码中使用了两个size 50。

+0

关于在函数内部分配内存并将它释放到外部的评论是完美的。但是,有没有办法可以编写一个接受char数组的函数,对其进行处理并生成输出(此输出数组的长度因输入而异)。这里的输出数组大小是动态的,所以有可能处理这种情况。 *从调用点分配和释放函数调用之前和之后的输出数组可能不是一个好主意。 –

0

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

随着错误,你必须得到这个。
警告:函数返回局部变量的地址。

总是看看警告。该问题已由Greg回答。