我正在尝试开发一种自定义方法
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
时得到垃圾值的原因。
请分享您对此的想法。 预先感谢。
让我们做一个更简单的函数:
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
现在指向不同的元素。