使用memcpy后无法打印指针

时间:2015-01-14 20:25:35

标签: c pointers

我试图将自己的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;
}

1 个答案:

答案 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;
}