什么时候指针减法在C中未定义?

mk1*_*k12 10 c arrays pointers pointer-arithmetic undefined-behavior

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
}
Run Code Online (Sandbox Code Playgroud)

这是有效还是未定义

我会认为它是有效的,但我读到了一些关于它未定义的东西,所以我用谷歌搜索它.这些链接似乎不可避免地声称它未定义:

但是,在这些SO问题中没有提到它:

这些都谈论不是两个指针在同一个"数组"中.这实际上是指堆栈上的普通旧C数组吗?

如果它是未定义的,那对我来说似乎很奇怪...当我可以访问一个常量指针和一个移动指针时,为什么强迫我携带一个计数器变量?

eca*_*mur 6

malloccount 指向的内存块指针指向同一个数组:

7.22.3内存管理功能

1 - malloc如果分配成功,[from ] 返回的指针可以被分配给指向任何类型对象的指针,然后用于访问此类对象或空间中此类对象的数组已分配(直到空间被明确释放).