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値が array の境界を超えて返されるのはなぜですかpmemchrうまくいきました。
そのような行動が意図的なものである場合、なぜですか?

4

2 に答える 2

4

問題はmemrchr vs memchrではありません。あなたはそれを次のように呼んでいます:

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

これは、文字列で始まる文字列を検索すること's'を意味します。要求したことを実行し、文字列の外側にあるnull ターミネータと他の 2 つの値を調べます。代わりに、次のように呼び出す必要があります。p+3strlen(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 に答える