1

皆さん、これは の実装ですがmemset()、コードに論理的な誤りが 1 つあります。見つけるのを手伝ってくれませんか。

ターゲット文字列のダブルポインターをこの関数に渡す必要があると思います。これは、ポインター自体ではなく、ポインター変数のアドレスを渡すようなものです。

MS VC++ IDE でコードを実行すると、「アクセス違反」が発生します。

「C」ライブラリ関数 memset の定義は次のとおりです。

void *memset(char *s, char c, size_t n) 

Copy c to the first n characters of s. Return s.


void *memset(char *s, char c, size_t n)
{
  size_t i;
  for (i = 0; i < n; i++, s++)
  {
    *s = c;
  }
  return s;
}
4

7 に答える 7

6

これにはいくつかの問題があります。

void *memset(char *s, char c, size_t n)
{
  size_t i;
  for (i = 0; i < n; i++, s++)  /* incrementing s means you cannot return */
  {                             /* the original value */
    *s = c;                     /* consider using s[i] = c after not incr. s*/
  }
  return s;                     /* this should probably be a cast back to void */
}
于 2009-05-02T01:45:20.210 に答える
4

返されるポインターを変更するべきではありません。

于 2009-05-02T01:43:49.463 に答える
4

関数の戻り値を確認してください。それは何を返しますか?何を返すように文書化されていますか?

于 2009-05-02T01:43:59.310 に答える
1

「アクセス違反」が発生していることを表明します。これは、's'にnull以外の値を指定して関数を呼び出しているが、's'が正しく初期化されていないことを示しています。

// bad - s will have some arbitrary value as allocated on the stack (all bets are off)
char *s;
memset(s,0,100);

// good
char s[100];
memset(s,0,100);

// bad - the memset will generate an access violation on byte 101
char s[100];
memset(s,0,101);

// good
char *s = malloc(100);
memset(s,0,100);

**アクセス違反に関係のない1つの注意...'s'を返す方法は、string.hの従来のmemset()と同じ動作ではありません。そのライブラリでは、戻り値は入力としての「s」の値であると想定されています。コードでは、アクセス違反を生成する最後のバイトの後のバイトへのポインタを返しています。例えば:

// good
char *s = malloc(100);
char *d = memset(s,0,100);
printf("%s\n",d);  // generates an access violation

memset()docでは、dとsは同じ値である必要があります。コードでは、d = s [101];

于 2009-05-02T03:17:34.700 に答える
1

size_t n が 1 ずれているような気がします。

また、s は、関数の末尾の元の s ではなく、文字列の末尾を指します。

于 2009-05-02T01:46:01.143 に答える
1

s の値を変更してから返します。これは、memset 領域の開始点ではなく、終了点へのポインターを返すことを意味します(これはおそらく必要なことです)。

于 2009-05-02T01:50:33.457 に答える
0

うーん...これを試してみてください:

void *memset (char* s, char c, size_t n){
  char* begin = s;
  char* end = begin + n;
  whilw (begin != end) *begin++ = c;
  return s;
}
于 2009-05-02T01:53:35.463 に答える