1

伙计们,这里是 的一个实现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;
}
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

我有一种感觉,你的 size_t n 可能会减少一个。

s 也指向字符串的末尾,而不是函数末尾的原始 s。

于 2009-05-02T01:46:01.143 回答
1

您修改 s 的值,然后将其返回。这意味着您将返回一个指向memset 区域末尾的指针,而不是开头(这可能是您想要的)

于 2009-05-02T01:50:33.457 回答
1

您声明您遇到了“访问冲突”。这表明您正在使用“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' 与 string.h 中的传统 memset() 行为不同。在那个库中,返回值应该是“s”的值作为输入。在您的代码中,您将返回一个指向最后一个字节之后的字节的指针,这会产生访问冲突。例如:

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

在 memset() 文档中,d 和 s 应该具有相同的值。在您的代码中, d = s[101];

于 2009-05-02T03:17:34.700 回答
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 回答