我有一个奇怪的问题,我的程序在strcmp崩溃。
在gdb核心分析中,我看到两个被检查的字符串都是理智的,这意味着它们的指针不是NULL,它们包含有限的空终止值。
然而,其中一个字符串是垃圾(不是变量要包含的字符串)
撇开它是垃圾的事实,我真的想知道为什么strcmp会因2个健全的字符串而崩溃?可能的原因是什么?
提前致谢!
编辑:
一个例子,
a = strcmp(b,c);
(gdb) p b
$92 = 0x7f58d3a36b89 "H\205\300uRH\215}\320\350\a\300\361\377A\276"
(gdb) p c
$93 = 0x2041e48 "MAIN"
答案 0 :(得分:1)
b
和c
的值似乎确定,但由于优化,尤其是围绕可能会经历强烈宏扩展的strcmp()
等功能,实际值可能无法供调试器使用。
在源代码中可能很容易发现问题,您应该将源发布到违规函数。
0x7f58d3a36b89
为变量gdb
打印的值b
非常大!您可以尝试以这种方式修改代码:
static char bb = *b;
static char cc = *c;
a = strcmp(b, c);
在b
之前强制访问c
和strcmp()
可能会导致崩溃,并让您验证b
是否确实是gdb
打印出来的$name="'m'w'a'n'g'i'";
$name = str_replace("'","",$name);
echo $name // prints mwangi
是。