将 char 数组接收到 void 指针会显示不同的行为

问题描述 投票:0回答:1

我正在尝试开发一种自定义方法

strcpy
。我考虑了两种实现方法。一种方法涉及使用
memcpy
,而另一种方法涉及递增指针并分配值。

使用

memcpy
的实现按预期进行。代码片段粘贴在下面。

#include <stdio.h>
#include <string.h>

void mystrcpy(void *dest, void *src, size_t size)
{

    memcpy((char*)dest,(char*)src,size);
    printf("Final - %s\n",(char*)dest);
}



int main()
{
    char *src = "ABC";
    char dest[20];
    printf("%p %p\n",src,dest);
    mystrcpy(dest,src,4);

    return 0;
}

输出如下:

000000000040400C 000000000061FE00
Final - ABC

因此,我进行了第二次实施,但还没有完全完成。 由于我刚刚开始,我看到了一些与我预期不同的行为。我对此不太确定。也许我在这里落后了一些非常重要的概念。

在这里,我考虑为源和目标采用两个

void*
参数。类似于下面的内容。

void mystrcpy(void *dest, void *src)

在下面粘贴我的代码,

#include <stdio.h>
#include <stdint.h>

void mystrcpy(void *dest, void *src)
{

    char *_dest = (char*)dest;
    char *_src = (char*)src;

    *_dest = *_src;
    printf("%c %c\n",*_src,*_dest);
    printf("%p %p\n",_src,_dest);
    _src++ ; _dest++;


    *_dest = *_src;
    printf("%c %c\n",*_src,*_dest);
    printf("%p %p\n",_src,_dest);
    _src++ ; _dest++;


    *_dest = *_src;
    printf("%c %c\n",*_src,*_dest);
    printf("%p %p\n",_src,_dest);
    _src++ ; _dest++;

    *_dest = '\0';

    printf("Final - %d %d %d  %p %p %p\n",_dest[0],_dest[1],_dest[2],&_dest[0],&_dest[1],&_dest[2]);
}



int main()
{
    char *src = "ABC";
    char dest[20];
    printf("%p %p\n",src,dest);
    mystrcpy(dest,src);

    return 0;
}

输出显示

0000000000404034 000000000061FE00

A

0000000000404034 000000000061FE00

B

0000000000404035 000000000061FE01

C C

0000000000404036 000000000061FE02

最终 - 0 0 0 000000000061FE03 000000000061FE04 000000000061FE05

它正在按预期复制值。我只是对最后一张打印感到困惑, 它是如何变成 xxx03 xxx04 xxx05 而不是 xxx00 xxx01 xxx03 !!。这就是为什么我在打印

_dest
时得到垃圾值的原因。

请分享您对此的想法。 预先感谢。

c void-pointers char-pointer
1个回答
0
投票

让我们做一个更简单的函数:

void test(char *dest)
{
    char *original_dest = dest;  // Now both variables points to the same location

    dest++;  // Now dest points somewhere else
}

初始化

original_dest
后,内存看起来像这样:

+------+
|目的地 | ------------\
+------+ \ +---+---+---+----
                      >--> | 0 | 1 | 2 | ...
+---------------+ / +---+---+---+----
|原始目的地 | --/
+----------------+

两个指针都指向同一个位置。

但是在

dest++
之后它会看起来像这样:

+------+
|目的地 | ------------------\
+------+ |
                            v
+---------------+ +---+---+---+----
|原始目的地 | --> | 0 | 1 | 2 | ...
+---------------+ +---+---+---+----

因此

original_dest
仍然指向与之前相同的原始元素,但
dest
现在指向不同的元素。

© www.soinside.com 2019 - 2024. All rights reserved.