【问题标题】:SIGSEGV in my C split()我的 C split() 中的 SIGSEGV
【发布时间】:2013-11-25 05:12:12
【问题描述】:
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,指向复制问题的最小可编译代码。

【问题讨论】:

  • 您应该在调试器中运行它(或随意添加打印语句)以确定崩溃点的变量值。
  • 我做到了,每一个价值都是完美的。终于明白这是个glibc文件,打开到第164行,是汇编,我不知道汇编:/
  • 如果您在strcmp 中调用seg-fault,那么有两种可能性:(A)strcmp 中存在错误; (B) 每个值都 not 完美;) 最可能的原因是您没有将有效的 C 字符串传递给它。
  • 确实看起来 *--p 带来了 NULL - 它怎么能通过 while 循环?
  • 你应该在你的程序过程中检查p(和*p)的值。

标签: c


【解决方案1】:

问题出在这里:

while(*p++);

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

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

在这里你将p 递减一次,然后将*p 馈送到strcmp,它是NULL,导致程序崩溃。 修复很简单,首先测试为零,然后递增:

while (*p) ++p;

【讨论】:

  • 是的。我只是在打字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 2013-06-17
相关资源
最近更新 更多