0
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 复制问题的最小可编译代码。

4

1 回答 1

3

问题在这里:

while(*p++);

这在测试为零p 后会增加。*p(更准确地说,它首先递增p,然后测试 的旧值*p是否为零。)如果*p为零,则在循环停止之前p已递增一。NULL

printf("%i", strcmp(*--p, "&"));

在这里,您减少p一次,然后馈送*pstrcmp它所在的位置NULL,使程序崩溃。修复很简单,首先测试为零,然后递增:

while (*p) ++p;
于 2013-11-12T21:04:31.710 回答