1

我有以下函数,它从串行设备读取缓冲区,获取一些令牌并每 10 秒打印一次这些令牌。我希望将这些结果保存在我在桌面中创建的 data.txt 中。在第一个循环中,我有结果,并且我在 txt 文件中也有它们,但是第二次出现此错误

***glibc detected***/home/pi/Desktop/programming/bin/Debug/programming: double free or corruption(top):0x00dbe178 ***

我知道问题出在我分配的可用内存上,但我不知道我的代码中的问题在哪里以及如何解决它。有人可以帮助我吗?

int learn_port2(int fd)
{
   int i;
   char buff[260];
   memset(buff, 0, sizeof(buff));
   char nodo[6] = "";
   char temp[6] = "";
   char hr[6] = "";
   char dw[6] = "";
   char vcc[6] = "";
   char* ptr;

   FILE *fp=fdopen(fd,"a+");
   FILE *ft = fopen("/home/pi/Desktop/data.txt","a+");
   time_t now;
   time(&now);

   while(fgets(buff, sizeof(buff), fp) != NULL)
   {
    fputs(buff,stdout);
    char *pos = strchr(buff,'N');
    if (pos)
    {

         ptr = strtok(buff, "Nodo_,=:V()");
         i = 0;
       while (ptr != NULL)
         {
          if (i == 0)
             strcat(nodo, ptr); 
          if (i == 2)
             strcat(temp, ptr); 
          if (i == 4)
             strcat(hr, ptr); 
          if (i == 6)
             strcat(dw, ptr); 
          if (i == 8)
             strcat(vcc, ptr);

          ptr = strtok(NULL, "Nodo_,=:V()");
          i++;
         }
       printf("Results: %s, %s, %s, %s, %s\n", nodo, temp, hr, dw, vcc);
       fprintf(ft,"%s,%s,%s,%s,%s\n", nodo, temp, hr, dw, vcc);

         fclose(ft);
      memset(nodo, 0, sizeof(nodo));
      memset(temp, 0, sizeof(temp));
      memset(hr, 0, sizeof(hr));
      memset(dw, 0, sizeof(dw));
      memset(vcc, 0, sizeof(vcc));
      printf("\n");
     }
  }
4

1 回答 1

0

发布的代码无法编译(我猜缺少}的是最后),但我可以指出一些问题:

  1. 阅读后您不会终止buff,因此strchr和/或strtok可能会结束
  2. strcat进入固定大小的缓冲区,而不检查你正在复制的东西是否合适。您可以在此处轻松注销缓冲区的末尾
  3. fclose(ft)多次。您只能在循环外执行一次

您应该修复所有这三个,如果仍然有错误,请发布新的可编译代码。

于 2013-06-18T08:17:08.593 回答