我正在尝试使用自己的memcpy版本将字符数组从一个指针复制到另一个指针.但是,这会产生错误.看来printf存在问题.
其次,官方memcpy函数返回目标指针.这真的需要吗?如果我修改*dest,它应该反映在*d中.那么返回什么需要什么呢?
#include <stdio.h>
void memcpy2(void *dest, const void *src, size_t n)
{
char *dp = dest;
const char *sp = src;
while (n--)
*dp++ = *sp++;
}
int main(void) {
char *c = "Hello";
char *d=NULL;
memcpy2(d,c,3);
printf( "%c", *d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你取消引用一个NULL未定义行为的指针,你应该分配空间并指向它,d以便它可以工作,这样做,而不是
d = NULL
Run Code Online (Sandbox Code Playgroud)
写
d = malloc(3);
Run Code Online (Sandbox Code Playgroud)
别忘了
free(d);
Run Code Online (Sandbox Code Playgroud)
之后printf().
如果你想自动地做出d一个有效的指针,然后写memcpy2()这样
void memcpy2(void **dest, const void *src, size_t n)
{
*dest = NULL;
if ((src == NULL) || (n == 0))
return;
*dest = malloc(n);
if (*dest == NULL)
return;
char *dp = *dest;
const char *sp = src;
while (n--)
*dp++ = *sp++;
}
Run Code Online (Sandbox Code Playgroud)
然后你的主要是
int main(void) {
char *c = "Hello";
char *d = NULL;
memcpy2(&d, c, 3);
/* ^ pass the address of the pointer, so you can change where it points to */
if (d != NULL) /* prevent NULL dereference. */
{
printf("%c", *d);
free(d);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)