检查C语言中的空指针分段错误

检查C语言中的空指针分段错误,c,list,pointers,null,segmentation-fault,C,List,Pointers,Null,Segmentation Fault,我必须拆分一个初始字符,并创建一个所述字符的列表,该列表必须以NULL结尾,这样我就可以在不知道列表大小的情况下在main中进行迭代。问题是,每当我尝试检查最后一个元素是否为NULL时,我都会遇到seg错误。很抱歉,我仍在努力学习C和英语。谢谢大家 #include <stdlib.h> #include <stdio.h> char **split(const char *s) { char **split; unsigned m_size = 0,

我必须拆分一个初始字符,并创建一个所述字符的列表,该列表必须以NULL结尾,这样我就可以在不知道列表大小的情况下在main中进行迭代。问题是,每当我尝试检查最后一个元素是否为NULL时,我都会遇到seg错误。很抱歉,我仍在努力学习C和英语。谢谢大家

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

char **split(const char *s) {
    char **split;
    unsigned m_size = 0, c_size, i, j, k;

    // get s size
    for (i = 0; s[i] != '\0'; i++) {
        if (s[i] == ' ') {
            m_size++;
        }
    }
    m_size++;

    split = (char**) malloc(sizeof(char) * (m_size + 1));

    int sizes[m_size];
    c_size = 0;

    // get s words size
    for (i = 0, j = 0; s[i] != '\0'; i++) {
        if (s[i] == ' ') {
            c_size++;
            sizes[j] = c_size;
            c_size = 0;
            j++;
        } else {
            c_size++;
        }
    }
    sizes[j] = c_size;

    for (i = 0; i < m_size; i++) {
        split[i] = (char *) malloc(sizeof(char) * sizes[i]);
    }
    split[i] = NULL;

    for (i = 0, j = 0, k = 0; s[i] != '\0'; i++) {
        if (s[i] != ' ') {
            split[j][k] = s[i];
            k++;
        } else {
            split[j][k] = '\0';
            j++;
            k = 0;
        }
    }

    return split;
}

int main() {
    char s[19] = "hello how are you?";
    char **splitted;
    unsigned i;
    splitted = split(s);
    if (splitted == NULL) {
        return 1;
    }
    for (i = 0; splitted[i]!=NULL; i++) {
        printf("%s\n", splitted[i]);
    }
    return 0;
}
编辑


好了,伙计们,我按照你们的提示编辑了我的代码。如果有人想指出其他错误,我将不胜感激。现在,它甚至可以用于多个空间。多亏了all,您正在请求一个指向字符的指针数组,但您正在分配一个字符数组:

split = (char**) malloc(sizeof(char) * (m_size + 1));
应该成为

split = malloc(sizeof(char*) * (m_size + 1));

注意sizeofchar*。顺便说一句:请注意,在C中,您不应该按照SO post中的解释强制转换malloc的结果。

第一个malloc必须使用sizeof指针:split=mallocsizeofchar**m_size+1;或者,最好使用对象本身:split=mallocsizeof*split*m_size+1;除了分配到拆分时的错误大小外,还应为每个字符串分配大小[i]+1以容纳空终止符。如果输入没有以空格结尾,那么最后一个字符串也不能正确地以null结尾。如果在单词之间有两个空格,那么您的代码将如何运行?前你好世界。您想要像[Hello,World]或[Hello,World]这样的拆分数组吗?如果你想要前者,那么当前的代码就无法做到。最好的方法可能是使用:split=malloc sizeof*split*m_size+1;由于它确保了正确的分配大小,因此在对象拆分类型指向以及拆分类型本身发生变化的情况下。
split = malloc(sizeof(char*) * (m_size + 1));