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
}
这是有效的还是未定义的?
我会假设它是有效的,但我读到了一些关于它未定义的内容,所以我用谷歌搜索了它。这些链接似乎不可避免地声称它是未定义的:
但是,在这些 SO 问题中没有提到它:
这些都在谈论不是两个指针在同一个“数组”中。这实际上是否意味着堆栈上有一个普通的旧 C 数组?
如果它是未定义的,对我来说似乎很奇怪……当我可以访问一个常量指针和一个移动指针时,为什么要强制我携带一个计数器变量?