【发布时间】:2012-08-06 06:17:29
【问题描述】:
我最近有一个面试问题,我必须实现 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 进行迭代,然后用另一个索引
嗯,这看起来很奇怪,因为我多年来一直使用 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字节”?我在这里看不清楚什么?
【问题讨论】:
-
旁注:您不能取消引用
void*。 -
原型应该是
void memcpy (void* dest, const void* src, size_t size);。如果它需要与 C 标准 memcpy() 兼容,它应该返回一个 void*。 -
@Lundin:小修正,我想你在这里打错了,原型应该是“void* memcpy (void* dest, const void* src, size_t size);”
-
@Rndp13 阅读整个评论。挑剔一点,标准的C原型是
void* memcpy (void*restrict s1, const void*restrict s2, size_t n);