检查C语言中的空指针分段错误
我必须拆分一个初始字符,并创建一个所述字符的列表,该列表必须以NULL结尾,这样我就可以在不知道列表大小的情况下在main中进行迭代。问题是,每当我尝试检查最后一个元素是否为NULL时,我都会遇到seg错误。很抱歉,我仍在努力学习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,
#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));