在 malloc'ing 时出现分段错误

Getting segmentation fault while malloc'ing

提问人:Nick 提问时间:4/1/2014 更新时间:4/1/2014 访问量:69

问:

我在第二次运行 malloc 时遇到分段错误:

#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并使用双指针而不是三指针keywords_init它就可以正常工作。

c

评论

0赞 Steve Cox 4/1/2014
我认为使用三重指针表明存在轻微的设计缺陷
1赞 wildplasser 4/1/2014
您可以通过返回指针数组并按指针传递计数来避免三星级编程。未来的维护者实际上会爱上你。和。。。提示:避免 strtok() 它是邪恶的,它很糟糕。
1赞 M.M 4/1/2014
目前,他返回了两个东西:“双指针”和 int。您似乎建议返回并具有参数,而不是返回和参数。我不明白为什么原则上应该避免后者。char **int *intchar ***

答:

4赞 Paul R 4/1/2014 #1

您被运算符优先级/关联性咬伤了 - 更改以下两个情况:

*str_arr[i]

自:

(*str_arr)[i]