2013-10-31 99 views
0

我有這個程序讀取一個字符串並將其分爲三部分。第一部分是操作碼,第二部分是數據,第三部分是關鍵。使用Valgrind錯誤 - 字符串拆分C

例子:

put this is stackoverflow 

opcode: put 
data: this is 
key: stackoverflow 

代碼主營:

int main(int argc, char **argv){ 
      char command[MAX_MSG]; 
      fgets(command, sizeof(command), stdin); 
      command[strcspn (command, "\n")] = '\0'; 
      char *aux_command = strdup(command); 
      char *opcode = strtok(command, " ");   
      int success = 0; 
      char *key ; 
      char *data; 
      if(strcmp(opcode, "put") == 0){ 
      key = getKey(strdup(aux_command), opcode); 
      if(key == NULL){ 
        printf("Invalid number of arguments.\n"); 
        success = -1; 
      } 

      else{ 
        data = getData(aux_command, opcode, key); 

      } 
     } 
     printf("opcode: %s\n",opcode); 
     printf("data: %s\n",data); 
     printf("key: %s\n",key);    
     free(aux_command); 

} 

我的問題是,當我運行我的程序與valgrind它給出了這樣的結果:

==2663== by 0x4EBD971: strdup (strdup.c:42) 
... 
==2663== definitely lost: 12 bytes in 1 blocks 
==2663== indirectly lost: 0 bytes in 0 blocks 
==2663==  possibly lost: 0 bytes in 0 blocks 
==2663== still reachable: 0 bytes in 0 blocks 
==2663==   suppressed: 0 bytes in 0 blocks 
==2663== 
==2663== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2) 

我不不知道爲什麼會發生這種情況。謝謝。

+0

絕對不使用'這裏memmove'一件好事:你不能用它當源和目的地是重疊的,因爲它是這裏的情況。 – Bentoy13

+1

爲什麼不只是在空間上使用命令字符串,使用第一個標記作爲操作碼,最後作爲關鍵字,並將所有中間標記與空格連接以重構數據? – OlivierD

+1

@ Bentoy13 memmove完全是爲了處理重疊內存的唯一目的而存在的:http://en.cppreference.com/w/cpp/string/byte/memmove。 – OlivierD

回答

1

你應該strdup()符合

key = getKey(strdup(aux_command), opcode); 

由它分配的內存free()內存分配是沒有得到釋放,因此Valgrind是顯示它作爲記憶喪失。

的推薦代碼:

... 
     char *command =NULL; //declare variable 
     char *key ; 
     char *data; 
     if(strcmp(opcode, "put") == 0){ 
     command = strdup(aux_command); //use variable to store new memory 
     key = getKey(command, opcode); 
     if(key == NULL){ 
       printf("Invalid number of arguments.\n"); 
       success = -1; 
     } 

     else{ 
       data = getData(aux_command, opcode, key); 

     } 
    } 
    printf("opcode: %s\n",opcode); 
    printf("data: %s\n",data); 
    printf("key: %s\n",key);    
    free(aux_command); 
    free(command); //free it when done 
+2

「建議的代碼」也可以通過檢查'strdup'是否返回NULL來獲益。 ;) – Shahbaz

+0

實際上,在strdup之後檢查NULL必須是直的。 –

+0

@Shahbaz,同意,但代碼並不完整代碼審查,但對問題的建議描述。 – Rohan