что не так с этим фрагментом кода - PullRequest
1 голос
/ 02 мая 2009

Люди, вот реализация memset(), однако мне сказали, что в коде есть одна логическая ошибка. Не могли бы вы помочь мне найти это.

Я чувствую, что двойной указатель для целевой строки должен быть передан этой функции, что будет похоже на передачу адреса переменной указателя, а не самого указателя.

При выполнении кода в 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;
}

Ответы [ 7 ]

6 голосов
/ 02 мая 2009

У этого есть несколько проблем.

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 */
}
4 голосов
/ 02 мая 2009

Проверьте возвращаемое значение функции. Что это возвращает? Что задокументировано, чтобы вернуть?

4 голосов
/ 02 мая 2009

Вы не должны изменять указатель, который возвращается.

1 голос
/ 02 мая 2009

Вы заявляете, что получаете «нарушение доступа». Это означает, что вы вызываете функцию с ненулевым значением для 's', однако, либо '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);

** одна заметка, не связанная с нарушением прав доступа ... возвращение 's' так, как вы делаете, отличается от обычного memset () в string.h В этой библиотеке возвращаемое значение должно быть значением '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];

1 голос
/ 02 мая 2009

Вы изменяете значение s и затем возвращаете его. Это означает, что вы будете возвращать указатель на end области memset, а не на начало (что, вероятно, то, что вы хотите)

1 голос
/ 02 мая 2009

У меня такое ощущение, что ваш size_t n может быть выключен на единицу.

Также s указывает на конец строки вместо исходного s на конец функции.

0 голосов
/ 02 мая 2009

Hum ... Попробуйте это:

void *memset (char* s, char c, size_t n){
  char* begin = s;
  char* end = begin + n;
  whilw (begin != end) *begin++ = c;
  return s;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...