malloc申请内存机制,为什么申请超出小弟我的内存空间了还能成功,很奇怪

malloc申请内存机制,为什么申请超出我的内存空间了还能成功,很奇怪
看这个小程序
#include <stdio.h>
#include <malloc.h>

int main()
{
int a[1000];
int *p = (int *)malloc(sizeof(int)*20000*200000*200000*20);
if (p == NULL)
{
printf("fail\n");
}

else
{

*(p+1) = 1;

printf("ok\n");
}
printf("%d",(*(p+1)));
free(p);
return 0;
}


我用malloc申请了那么空间,可是我的电脑只有2.75G内存+3G虚拟内存
明显超过了,但为什么能申请成功?
如果我把程序申请大小改为sizeof(int)*20000*200000*200000*200就返回NULL申请失败了
想问下malloc到底是什么机制?求大神指教!
------解决方案--------------------
sizeof(int)*20000*200000*200000*20溢出了,实际可能不是很大...
------解决方案--------------------
申请的是线性空间,进程空间,并不能完全对应物理内存,你的64位的程序吧,32位的程序开始的也不能申请这么大。
------解决方案--------------------
malloc的参数是一个 unsigned integer
把那个数据计算结构放到一个无符号整形里面就是申请的内存空间。
看似已经超出来范围,但得到的整形数的结果不会超出整形数。
------解决方案--------------------
超出类型,溢出了,最终变成 832564344,也就是越位793MB
如果最后是乘以200,溢出后变成4030726144,也就是3.8G
显然,前者会成功,后者会失败