从函数返回值存储char *

我试图实现从串行端口(Linux)读取和retuns char *的函数。 该函数工作正常,但我将如何存储函数的返回值。 function的例子是

char *ReadToSerialPort() { char *bufptr; char buffer[256]; // Input buffer/ / //char *bufptr; // Current char in buffer // int nbytes; // Number of bytes read // bufptr = buffer; while ((nbytes = read(fd, bufptr, buffer+sizeof(buffer)-bufptr -1 )) > 0) { bufptr += nbytes; // if (bufptr[-1] == '\n' || bufptr[-1] == '\r') /*if ( bufptr[sizeof(buffer) -1] == '*' && bufptr[0] == '$' ) { break; }*/ } // while ends if ( nbytes ) return bufptr; else return 0; *bufptr = '\0'; } // end ReadAdrPort //In main int main( int argc , char *argv[]) { char *letter; if(strcpy(letter, ReadToSerialPort()) >0 ) { printf("Response is %s\n",letter); } } 

你应该用malloc在堆中分配一个缓冲区,然后返回它。 你的函数的用户将负责释放内存(你的文档必须清楚地说明这一点!)

一个简单的改变将是

 char* buffer = (char*)malloc(256); // beware that now `sizeof(buffer)` will be not 256 any more, but 4, so // you have to define your constant for it. ... if (nbytes) return buffer; free(buffer); return 0; ... int main(int argc, char *argv[]) { char *letter = ReadToSerialPort(); if (letter) { printf("Response is %s\n", letter); free(letter); return 0; } return 1; } 

请注意,代码*bufptr = '\0'; 应该在return之前,不要以后!

编辑
你的代码是这样的:

 char *ReadToSerialPort() { const int buffer_size = 256; char *buffer = (char *)malloc(buffer_size); char *bufptr = buffer; int nbytes; while ((nbytes = read(fd, bufptr, buffer+buffer_size-bufptr-1)) > 0) { bufptr += nbytes; } *bufptr = '\0'; if (bufptr != buffer) return bufptr; // else cleaning up free(buffer); return 0; } 

我很好奇fd从哪里来?

修正你的主代码看起来像这样:

 //In main int main( int argc , char *argv[]) { char *letter = ReadToSerialPort(); if(letter != NULL) { printf("Response is %s\n",letter); } } 

确保在ReadToSerialPort()使用声明为static的缓冲区…..即:

 static char buffer[256]; 

你需要更多的指定你的功能。 你不能简单的说“返回一个char * ”。 它指向的字符在哪里? 在一个静态缓冲区? 在堆上(由new分配)? 它看起来像你试图返回一个指向本地缓冲区(分配在堆栈上),这是一个错误。 或者,返回一个std::string

您应该更改ReadToSerialPort()的签名以通知调用方您要返回的字节数。 所以你可以这样做:

 int ReadToSerialPort(char** data); 

或这个:

 void ReadToSerialPort(char** data, int* num_of_bytes); 

并保持负责分配ReadToSerialPort()内的内存空间。

用户会做一些像(未测试):

 int main( int argc , char *argv[]) { char* data = NULL; int count = 0; ReadToSerialPort(data, &count); if (data != NULL && count > 0) // Let's suppose count returns as 5 { printf("data[0]:%x data[1]:%x data[2]:%x data[3]:%x data[4]:%x\n", data[0], data[1], data[2], data[3], data[4]); } // and the user is responsible for deallocating data himself free(data); return 0; }