【发布时间】:2016-02-08 13:00:23
【问题描述】:
我正在编写一个 hobbyOS。我想将一小部分内存从一个点复制到另一个点。不知何故,我的memmove 函数一直在混淆前几个字节,而且只有前几个字节。
这是我的 memmove 函数:
void* memmove(void *dst, const void *src, uint32_t n)
{
const char *s;
char *d;
s = src;
d = dst;
if(s < d && s + n > d){
s += n;
d += n;
while(n-- > 0)
*--d = *--s;
} else
while(n-- > 0)
*d++ = *s++;
return dst;
}
然后我像这样调用函数:
char *dest
char *origin
memmove(dest, origin, 100);
当我检查内存后(我使用的是 Boschs)我在前几个字节中发现了这种奇怪的差异,之后的所有内容都按预期复制:
original at 0x502220:
0x0000000000502220 <bogus+ 0>: 0x50224468 0x223c6800 0x006a0050
copy at 0x0:
0x0000000000000000 <bogus+ 0>: 0x00504460 0x223c6800 0x006a0050
如您所见,只有前 4 个字节是乱码。其余部分按预期复制。
是什么导致了这种行为?
【问题讨论】:
-
你分配内存了吗?
-
代码看起来不错,与what I wrote for PDCLib 几乎相同,测试正常。 (欢迎您将 PDCLib 部分或整体用于您的爱好操作系统。它就是为此目的而编写的。)我怀疑您的测试有错误,真的。
-
你真的要搬到地址 0 吗?如果你真的是,也许你有其他东西写入空指针?
-
@ElderBug: 空指针 与地址 0 不同。
-
@Olaf 没有理智的编译器会使空指针不为 0。C 标准要求
(char*)0转换为空指针。