我最近有一个面试问题,我必须实现 memcpy。根据我的经验,我使用过很多 memcpy,所以这似乎不是一个棘手的问题。
所以,我开始实现一个循环,从指针到指针一次复制一个地址,如下所示:
void memcpy(void* dest, void* src, int size){
for(int index = 0; index < size; index++){
dest[index] = src[index];
}
}
然而,面试官打断了他们注意到 memcpy 的手册页说它“将 n 个字节从 src 复制到 dest”(我稍后确认)然后希望我通过 size/4 进行迭代,然后用另一个索引循环来获取剩余的< size%4 (我猜假设它是 32 位系统?)
好吧,这看起来很奇怪,因为我多年来一直没有问题地使用 memcpy 而不必给它一个 *4 修饰符)。当我回到家时,我启动了 gdb 并复制了一个小字符串“hello”,并小心地使用 strlen() 和常量输入大小以查看它在哪里开始和停止。
char* src = "hello";
char* dest = calloc(16, sizeof(char));
int len = strlen(src);
memcpy(dest, src, len); // both my version and official version
现在我用 gdb 仔细检查了 src 和 dest,它们都包含“hello\0”。
所以我的问题是:我对使用数字 4(或“以字节为单位的大小”)有什么不理解?当这不是真正的行为时,为什么文档会说“n字节”?我在这里看不清楚什么?