2013-06-18 125 views
1

我有以下功能,它從串行設備讀取緩衝區,獲取一些令牌並每隔10秒打印這些令牌。我想要這些結果將它們保存在我在桌面上創建的data.txt中。在第一圈我有結果,也是我讓他們在txt文件,但第二次我有這樣的錯誤glibc檢測到雙免費或腐敗

***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"); 
    } 
    } 
+5

你應該在debug中編譯並使用'gdb' /'valgrind'來跟蹤你的錯誤。 – BenC

+6

您在while循環中關閉ft。如果下一次循環運行到fprintf(ft,...)ft將已經關閉。可能這會導致該消息= – urzeit

+0

@urzeit是正確的。 'fclose()'被多次調用。 – devnull

回答

0

張貼的代碼不編譯(我猜失蹤}是在結束),但我可以指出一些問題:閱讀後

  1. 你不NUL,終止buff因此,strchr和/或strtok可能會結束
  2. strcat到固定大小的緩衝區,而不檢查您正在複製的內容是否適合。你可以很容易地在這裏註銷緩衝區的末尾
  3. fclose(ft)多次。您必須做到這一點只有一次,循環

您應該解決所有這三個之外,併發布新的編譯代碼,如果仍然有錯誤。

+0

你是對的。隨着您的通知1和3,我找到了解決方案 – dali1985

相關問題