最近我参加了一次面试,其中需要我实现memcpy函数。由于我的经验中使用了大量memcpy函数,所以这似乎不是一个难题。
因此,我开始实现一个循环,从指针到指针逐个复制地址,类似于以下代码:
void memcpy(void* dest, void* src, int size){
for(int index = 0; index < size; index++){
dest[index] = src[index];
}
}
然而,面试官打断了我指出memcpy的man page上说它“从src复制n个字节到dest”(后来我证实了这一点),然后想让我通过size/4进行迭代,再用另一个循环来处理剩下的index < 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个字节”,而实际上并非如此?我在这里看不清楚什么?
void memcpy (void* dest, const void* src, size_t size);
。如果需要与C标准的memcpy()兼容,它应该返回一个void*。 - Lundinvoid* memcpy (void*restrict s1, const void*restrict s2, size_t n);
。 - Lundin