【问题标题】:Unable to print a pointer after using memcpy使用 memcpy 后无法打印指针
【发布时间】:2015-01-14 20:25:35
【问题描述】:

我正在尝试获取我自己的 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;
}

【问题讨论】:

  • memcpy 是一个系统函数。系统功能总是需要一种方法来指示成功/失败。系统函数需要有一致的接口,包括返回值。对于 memcpy,成功返回目标地址或失败返回 NULL 是系统函数与其余系统函数保持一致的方式

标签: c pointers


【解决方案1】:

您取消引用未定义行为的 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;
}

【讨论】:

  • 但它不应该为NULL,因为它首先通过memcpy,并且不会为“d”分配一个值?
  • @sbhatla 您必须将有效指针传递给memcpy(),该指针至少指向您请求复制的内存。而src指针也应该满足同样的要求。
  • memcpy2() 中很好的角落案例处理。
  • memcpy2 将返回 NULL 指针有几个原因。所以在 main() 中需要检查一个 NULL 指针。永远不要假设一个函数按预期工作,即使是你自己的函数。请注意 memcpy2() 函数实际上会检查错误,而不是盲目地假设一切都已更正并且 malloc 成功
猜你喜欢
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
相关资源
最近更新 更多