2014-03-31 56 views
0

我得到一個分割故障第二次的malloc運行:獲取分段錯誤而malloc'ing

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int keywords_init(char *str, char ***str_arr); 

int main(void) { 

    char str[] = "keyword1,keyword2,keyword3"; 
    char **str_arr = NULL; 
    int arr_elements; 

    arr_elements = keywords_init(str, &str_arr); 

    return 0; 
} 

int keywords_init(char *str, char ***str_arr) { 
    int i; 
    char *pch; 

    /* String break */ 
    pch = strtok(str, ","); 
    for (i = 0; pch != NULL; i++) { 
     *str_arr = realloc (*str_arr, (i+1)*sizeof(char *)); 
     *str_arr[i] = malloc (strlen(pch) + 1); 
     strcpy(*str_arr[i], pch); 
     printf("%d: %s\n", i, pch); 
     pch = strtok (NULL, ","); 
    } 

    return i; 
} 

什麼讓我困惑的是,如果我沒有通過str_arr的地址keywords_init並使用雙指針而不是關鍵字_init中的三元組,它工作得很好。

+0

我覺得用三指針的指示輕微設計缺陷 –

+1

你可以通過返回指針數組並通過指針傳遞計數來避免三星編程。未來的維護者會真的愛你。而... *提示*:避免strtok()它是邪惡的,它很糟糕。 – wildplasser

+1

目前他正在返回兩件事:「雙指針」和int。你似乎正在建議返回'char **'並且使用參數'int *',而不是返回'int'和參數'char ***'。原則上我不明白爲什麼應該避免後者。 –

回答

4

你得到的運算符優先級/關聯咬傷 - 改變兩次出現的:

*str_arr[i] 

到:

(*str_arr)[i]