5 ms·
> Use: > ptrdiff_t diff = (uintptr_t)ptrOld - (uintptr_t)ptrNew; The casts to uintptr_t are not needed in this case, as the result of subtracting two pointers
by bluetomcat 11y ago
> Use:
> ptrdiff_t diff = (uintptr_t)ptrOld - (uintptr_t)ptrNew;
The casts to uintptr_t are not needed in this case, as the result of subtracting two pointers already yields ptrdiff_t.
Also, the mere subtraction of two pointers that do not point to the same "array object" yields undefined behaviour as per the standard.
- stromgo 11y agoThe casts are needed for "dirty pointer math". Without the casts, &A[1] - &A[0] returns 1, not 4, for an int *A.
- sltkr 11y agoThe code is still wrong for another reason: if (uintptr_t)ptrOld < (uintptr_t)ptrNew, then the subtraction is calculated modulo some power of 2 yielding a large number. The result of converting this to a signed integral type like ptrdiff_t is implementation defined. In practice it works only if sizeof(ptrdiff_t) == sizeof(uintptr_t) AND the system uses two's complement for signed integers. Neither property is guaranteed by the standard. I think the correct way to find the byte offset is this: ptrdiff_t diff = (char*)ptrOld - (char*)ptrNew;
- _kst_ 11y agoAnd it's wrong for yet another reason. You can convert a pointer to uintprt_t, but arithmetic on the result isn't necessarily meaningful.
- shawn-furyan 11y agoThis thread makes me eager to get back into the minimal C programming that I left behind in my college assembly class. ~1 beat~ Yikes! ~leaves self-shaped dust cloud behind as hurriedly runs toward higher [level] ground~