Полагаю, если вы выделите достаточно большой буфер, ему потребуется еще несколько страниц, а затем он поместит буфер в начало первой страницы.Таким образом, вы можете выделить два очень больших буфера, удалить смещение заголовка буфера и затем GCD два буфера.Отлично сработало на моей системе.
#include <stdlib.h>
#include <stdio.h>
unsigned gcd(unsigned a, unsigned b)
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
void main() {
void *p1 = malloc(1000000);
void *p2 = malloc(1000000);
unsigned p1r = (unsigned) p1 & 0xfffffff0;
unsigned p2r = (unsigned) p2 & 0xfffffff0;
printf("page size = %u\n", getpagesize());
printf("p1 = %p, p2 = %p\n", p1, p2);
printf("p1r = %p, p2r = %p\n", p1r, p2r);
printf("gcd = %u\n", gcd(p1r, p2r));
}