这段代码片有什么问题

时间:2009-05-02 01:36:57

标签: c debugging memory-management compiler-errors

伙计,这是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 个答案:

答案 0 :(得分: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 */
}

答案 1 :(得分:4)

您不应该更改返回的指针。

答案 2 :(得分:4)

检查功能的返回值。它返回了什么?什么记录回来?

答案 3 :(得分:1)

我觉得你的size_t n可能会被一个人关闭。

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

答案 4 :(得分:1)

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

答案 5 :(得分: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()doc中,d和s应该具有相同的值。在你的代码中,d = s [101];

答案 6 :(得分:0)

...坎 试试这个:

void *memset (char* s, char c, size_t n){
  char* begin = s;
  char* end = begin + n;
  whilw (begin != end) *begin++ = c;
  return s;
}