【问题标题】:memccpy return lower memory address than the src starting addressmemccpy 返回比 src 起始地址低的内存地址
【发布时间】:2015-06-27 22:23:29
【问题描述】:

我有一个学校项目,我必须重新编码 memccpy() 函数。

我使用 2 个程序来检查我的代码是否正常工作。第一个是只有一个主程序的小程序。 第二个程序是另一个学生开发的(可以找到here,如果你想看的话)

使用我的程序,没有问题,我的 memccpy 和原始函数都从 dest 指针返回正确字符上的右指针。 但是对于第二个程序,原函数返回的指针地址比dest指针起始地址低,例如:

  • src值的起始地址:0x7fff712edc40
  • Memccpy 返回指针地址:0x712edc44
  • 我的 memccpy 函数返回指针:0x7fff712edc44

因此,当有人在他的计算机上编译并且我的代码返回正确的地址时,它必须来自第二个程序。

有人知道什么会导致这种行为吗?

  • 我尝试在 Google 上搜索,但答案不是很有帮助。
  • 我多次阅读该人 ^^'(没有更多帮助)。
  • 我读到 memccpy 在内存重叠时具有未定义的行为,但它们不重叠。

这是我的 ft_memccpy() 函数:

void    *ft_memccpy(void *str_dest, const void *str_src, int c, size_t n)
{
    unsigned int    i;
    char            *dest;
    char            *src;
    char            *ptr;

    dest = (char *)str_dest;
    src = (char *)str_src;
    i = 0;
    ptr = 0;
    while (i < n && ptr == 0)
    {
        dest[i] = src[i];
        if (src[i] == ((char)c))
            ptr = dest + i + 1;
        i++;
    }
    return (ptr);
}

编辑:我编辑是因为我投了反对票,而且许多用户不理解我的问题。所以我认为这还不够清楚,我希望这个编辑会^^'。

【问题讨论】:

  • 你期望什么返回值?
  • 我期待在第一个 'i' 之后指向 dest 中下一个字符的指针
  • 我无法重现该问题。 p1p2 指针是相同的。你能发布完整的可编译代码来演示这个问题吗?
  • 请出示您的printf 电话。想知道您正在使用什么格式说明符以及在哪里进行调用。
  • 奥利弗,您的问题不在ft_memccpy 中(或者从您的示例中看不出来)。两者都编译并返回相同的地址。我使用了以下printf 调用而不是printf ("\n p1 : %p\n p2 : %p\n\n", (char *)p1, (char *)p2);

标签: c libc


【解决方案1】:

这大概是64位指针和32位指针的问题。

您的ft_memccpy 将返回一个 64 位指针,因此它会输出

0x7fff712edc44

而系统memccpy返回一个32位的

0x712edc44

【讨论】:

  • 你想办法!我只是用 32 位编译了我的库和测试程序,它工作正常。
猜你喜欢
  • 2011-10-15
  • 1970-01-01
  • 2013-12-26
  • 2016-02-24
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
相关资源
最近更新 更多