2016-05-02 50 views
-3

我怎麼能free()strdup當看起來像這樣的電話:*(result + idx++) = strdup(token);如何在strdup之後釋放()?

更多上下文:

char **str_split(char *a[], char *a_str, const char a_delim) { 
    char **result = 0; 
    size_t count = 0; 
    char *tmp = a_str; 
    char *last_comma = 0; 
    char delim[2]; 
    delim[0] = a_delim; 
    delim[1] = 0; 

    /* Count how many elements will be extracted. */ 
    while (*tmp) { 
     if (a_delim == *tmp) { 
      count++; 
      last_comma = tmp; 
     } 
     tmp++; 
    } 

    /* Add space for trailing token. */ 
    count += last_comma < (a_str + strlen(a_str) - 1); 

    /* Add space for terminating null string so caller 
     knows where the list of returned strings ends. */ 
    count++; 

    result = malloc(sizeof(char *) * count); 
    if (result == NULL) { 
     printf("Error allocating memory!\n"); //print an error message 
     return result; //return with failure 
    } 

    if (result) { 
     size_t idx = 0; 
     char *token = strtok(a_str, delim); 

     while (token) { 
      assert(idx < count); 
      *(result + idx++) = strdup(token); /* memory leak! how to free() */ 
      token = strtok(0, delim); 
     } 
     assert(idx == count - 1); 
     *(result + idx) = 0; 
    } 

    return result; 
} 
+2

'result [idx ++]'我可以理解嗎? – Olaf

+0

'delim [0]'和'delim [1]'被使用,所以數組索引操作符不應被禁止。 – MikeCAT

+1

調用此函數的代碼在完成所有存儲的指針後,需要調用'free' –

回答

2

*(result + idx) = 0;線使得可以告訴哪裏是序列的結尾。 只需free()完成使用後分配的所有元素。 完成使用後,存儲自身的陣列應爲free()

char ** ret = char **str_split(/* some arguments */); 
size_t idx; 

/* deal with the result */ 

for (idx = 0; *(ret + idx) != NULL; idx++) { 
    free(*(ret + idx)); 
} 
free(ret); 
+2

使用'ret [idx]'比'*(ret + idx)'更好的風格' –

+0

現在它可以工作。我的情況看起來像'for(idx = 0; *(dealloc [f] + idx)!= NULL; idx ++){'因爲我有一個數組。 – Montao

1

當它與result完成後,調用此函數將不得不free每個指針在result代碼,然後free結果本身。

相關問題