【发布时间】:2023-03-21 14:59:01
【问题描述】:
我看了 http://www.opensource.apple.com/source/xnu/xnu-2050.24.15/libsyscall/wrappers/memcpy.c
并且不明白以下内容:
1-
里面
void * memcpy(void *dst0, const void *src0, size_t length) {
char *dst = dst0;
const char *src = src0;
行:
if ((unsigned long)dst < (unsigned long)src) {
我们如何将 dst 转换为 unsigned long ?这是一个指针!
2- 为什么他们有时喜欢向前复制,有时喜欢向后复制??
【问题讨论】:
-
可能是因为函数的创建者知道在XNU平台上,类型
unsigned long和指针大小一样?其他地方可能有一些静态断言可以确保情况确实如此。 -
为了提高这个问题的质量,最好有
dst和src的声明。这样问题就很清楚了,而无需按照提供的链接进行操作(但可能会随着时间的推移而改变)。 -
@alk 好主意。我将其添加到问题中。
-
指针是地址,地址可以表示为unsigned long
-
@alk - 如果你比较“不兼容的指针”,你会得到编译器的抱怨。在我看来,最简洁的编码方式是
if((void*)dst < (void*)src)。无需知道指针有多大,没有编译器投诉(任何指针都可以转换为void *)。