从函数返回值存储char*

sam*_*rat 2 c linux

我正在尝试实现一个从串行端口(Linux)读取并返回char*的函数.该函数工作正常,但我如何存储函数的返回值.功能的例子是

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*lad 5

你应该在堆上分配一个缓冲区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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,代码*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;
}
Run Code Online (Sandbox Code Playgroud)

我很好奇从哪来fd来的?