从函数返回值存储char *

时间:2010-12-22 15:44:58

标签: 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);
  }
}

4 个答案:

答案 0 :(得分: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;
}

请注意,代码*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来自哪里?

答案 1 :(得分:0)

将主要代码修改如下:

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

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

static char buffer[256];

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您应该更改 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;
}