char *buf = malloc(bufsize)
char *ptr = buf;
…
while(condition) {
ptrdiff_t offset = ptr - buf; // <========== THIS LINE
// offset will never be negative because we only ever *increase* ptr
if ((size_t)offset > bufsize) {
// we need more room
bufsize += 128;
buf = realloc(buf, bufsize);
ptr = buf + offset; // buf might be in a completely new location
}
*ptr++ = … // write this byte
}
这个是 有效的 还是 未定义的?
我一开始以为是有效的,但我读到了一些关于它是未定义的东西,所以我在谷歌上搜索了一下。这些链接似乎无法逃脱地声称它是未定义的:
- Secure coding
- Is subtraction of pointers not pointing to different elements of same array valid in C?
然而,这些 SO 问题中都没有提到它:
所有这些都谈论了不是指向同一“数组”的两个指针。那实际上是指栈上的一个普通的 C 数组吗?
如果它是未定义的,那对我来说似乎非常奇怪...为什么要强制我携带一个计数器变量,当我可以访问一个常量指针和一个移动指针?
p->arr[x][y];
也不会被定义,而不管x的值如何。目前还不清楚需要对p->arr[y]
做什么才能获得一个指针,以便可以对该区域内的所有地址进行索引。 - supercat