0
  1 #include<stdio.h>
  2 #include<string.h>
  3 
  4 int main(void)
  5 {
  6         char p[] = "I'm shia";
  7         printf("%p\n",p);
  8         printf("%d\n",memrchr(p+3,'s',strlen(p)));
  9         printf("%p\n",memchr(p,'i',strlen(p)));
 10         return 0;
 11 }

输出:

0x7fff0eeae950
0xeeae954  /*garbage value?*/
0x7fff0eeae956

为什么memrchr返回值超出数组的边界pmemchr工作正常。
如果这种行为是故意的,为什么?

4

2 回答 2

4

问题不在于memrchr vs memchr。你这样称呼它:

memrchr(p+3,'s',strlen(p));

's'这表示在以字符开头的字符串p+3中搜索strlen(p)memrchr执行您要求的操作也是如此,它查看空终止符和字符串之外的其他两个值。你应该这样称呼它:

memrchr(p+3,'s',strlen(p+3));

甚至:

memrchr(p+3,'s',strlen(p)-3);
于 2012-12-26T03:58:14.153 回答
2

进行了一些更改,但这不是您想在生产中使用的代码。可以看看 memrchr 是如何工作的。

#include<stdio.h>
#include<string.h>

 int main(void)
 {
         char p[] = "I'm shia";
         printf("%p\n",p);
         printf("%s\n",(char *)memrchr(p+3,'s',strlen(p) - 3));
         printf("%p\n", memchr(p,'i',strlen(p)));
         return 0;
 }

我的 cygwin 1.7 上的输出:

$ ./memrchr
0x28ac57
shia
0x28ac5d
于 2012-12-26T04:04:03.343 回答