|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 gandixiwang 于 2022-4-25 20:46 编辑
- #include <stdio.h>
- #include <stdlib.h>
- int main(void)
- {
- void *ptr=NULL;
- int i,count;
- size_t maximum=0;
- size_t blocksize[]={1024*1024*1024,1024*1024,1024,1};
- for(i=0;i<4;i++)
- {
- for(count=1;;count++)
- {
- ptr=malloc(maximum+blocksize[i]*count);
- if(ptr!=NULL)
- {
- maximum+=blocksize[i]*count;
- free(ptr);
- }
- else
- {
- break;
- }
- }
- }
- printf("malloc在当前环境下申请到的最大空间是:%.2fGB\n", maximum * 1.0 / 1024 / 1024 / 1024);
-
- return 0;
- }
复制代码
这段代码中我理解不了为什么
- ptr=malloc(maximum+blocksize[i]*count);
- if(ptr!=NULL)
- {
- maximum+=blocksize[i]*count;
- free(ptr);
- }
复制代码
这样写
还有为什么
- printf("malloc在当前环境下申请到的最大空间是:%.2fGB\n", maximum * 1.0 / 1024 / 1024 / 1024);
复制代码
要乘以1.0
就是不理解为什么
ptr=malloc(maximum+blocksize[i]*count);
要加上maximum
就比如maximum是当前记录为0,
它for循环了一次之后,maximum记录为1G
但是当它循环第二次的时候,ptr=malloc(maximum+blocksize[i]*count);
就相当于ptr=malloc(1G+1G*2);,那不就申请了3G吗?
为什么不先申请2G在申请3G,但是我把ptr=malloc(maximum+blocksize[i]*count);中的maximum
删掉后它又运行不出来
因为这里的malloc申请的就是一次性的最大空间啊,当然要带上maximum,在这基础上去叠加。
我知道你考虑的是什么,假设申请1G成功,下一次申请1G+2G要是失败了,就会直接以M为单位开始,这样看上去,似乎跳过了最大空间是2G的可能。如果单看G的过程,那确实是有漏洞。但是这里不是只有G一个单位,即使可能直接错过继续以G为单位增加的数值,也会以低一级单位MB补上。
这种方法实际上是为了加快效率,你要是1G 1G地往上加,如果空间比较大的话,就需要很多次循环了
|
|