伙计,这是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;
}
答案 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;
}