我试图将自己的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;
}
答案 0 :(得分:5)
你取消引用一个未定义行为的NULL
指针,你应该用d
分配空格并指向它,以便它可以工作,这样做,而不是
d = NULL
写
d = malloc(3);
并且不要忘记
free(d);
在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++;
}
然后你的主要是
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;
}