【发布时间】: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