ptrdiff_t links for the week-end
Pascal Cuoq - 2nd Mar 2012Here are two links related to ptrdiff_t:
- Ptrdiff_t is evil [removed dead link] a blog post for if you are not tired of conversion and promotion issues yet
- and an interesting answer on StackOverflow.
I was doubtful about the second one (I had no difficulties to accept the first one after the previous conversions-and-promotions-related posts on this blog). But type ptrdiff_t is for storing pointer differences right? Why would a compilation platform (compiler and associated standard library including malloc()) make it just too small to hold all possible pointer differences? So I tested it and StackOverflow user R.. is right:
#include <stddef.h>
#include <stdio.h>
main(){
printf("%d" (int) sizeof(ptrdiff_t));
}
Compiling as a 32-bit program:
$ gcc -m32 t.c && ./a.out 4
I am pretty sure I have allocated 2.2GB in a single malloc() call of a 32-bit process on this system. I was thankful for getting that much at the time too. But 4 bytes are not enough to hold all signed differences between two pointers to char within a single 2.2GB chunk of memory:
#include <stdio.h>
#include <stdlib.h>
main(){
char *p = malloc(2200000000U);
if (!p) return 1;
char *q = p + 2150000000U;
printf("%td" q - p);
}
Please take a moment to predict the number printed by the above program yourself before looking down.
$ gcc -m32 t.c && ./a.out -2144967296
