char ** split(char * s, char * separator) {
char ** words = malloc(sizeof(char *));
int i = 0;
char * word = strtok(strdup(s), separator);
while (word) {
words = realloc(words, sizeof(char *) * (i + 1));
words[i] = malloc(strlen(word) + 1);
strcpy(words[i++], word);
word = strtok(NULL, separator);
}
words = realloc(words, sizeof(char *) * (i + 1));
words[i] = NULL;
return words;
}
当尝试比较最后一个非空元素时,此函数会系统地出错,如下所示:
char ** p = split("a b c d e f", " ");
while(*p++);
printf("%i", strcmp(*--p, "&"));
使用此 gdb 输出:
程序收到信号 SIGSEGV,分段错误。__strcmp_sse42 () at ../sysdeps/x86_64/multiarch/strcmp-sse42.S:164 164 ../sysdeps/x86_64/multiarch/strcmp-sse42.S:没有这样的文件或目录。
当我谷歌“__strcmp_sse42”时,我发现有一百万个错误“SIGSEGV in [insert big package name]”这不是很令人鼓舞,但我很有可能犯了一个初学者错误,有人能发现吗?
谢谢!
PS:这里有一个链接:http : //pastebin.com/Q2qw2VPL 复制问题的最小可编译代码。