我试图实现从串行端口(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; }