【发布时间】:2020-10-14 05:03:45
【问题描述】:
我正在研究 C 中 strlen() 函数的实现。我需要了解它在我的一项任务中的工作原理。
#define ALIGN (sizeof(size_t))
#define ONES ((size_t)-1/UCHAR_MAX)
#define HIGHS (ONES * (UCHAR_MAX/2+1))
#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
size_t strlen(const char *s)
{
const char *a = s;
const size_t *w;
for (; (uintptr_t)s % ALIGN; s++) if (!*s) return s-a;
for (w = (const void *)s; !HASZERO(*w); w++);
for (s = (const void *)w; *s; s++);
return s-a;
}
我不明白 char* 的减法在“return s-a”语句中的作用。
这是 musl 的 strlen 实现。 glibc 的 strlen() 实现也使用了这种 char* 减法。
【问题讨论】:
-
!*s标记字符串的结尾(char 是字节零)。s-a返回结束地址(最后一个非 nul 字符位置 + 1,其中s当前是)减去开始地址(a是提供给函数的初始s的副本),因此长度字符串。
标签: c char libraries subtraction strlen