当前位置:   article > 正文

【总结】malloc最多能分配多大的内存空间?_malloc可以分配多大空间

malloc可以分配多大空间
malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
void* 类型表示未确定类型的指针。C,C++规定,void* 类型可以通过类型转换强制转换为任何其它类型的指针。 一般需和free函数配对使用。 但是,malloc最多能分配多大的空间呢?

下面给出一段代码:

  1. //malloc最多能分配多大的空间?
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. int main()
  5. {
  6. int count = 0;
  7. while (malloc(1 << 20))//一次性分配1M的内存空间
  8. {
  9. count++;
  10. }
  11. printf("%d\n", count);
  12. return 0;
  13. }

这段代码在linux的环境下的结果大约为3G;但是这个结果收到系统环境的影响。


下面这段代码来自《程序员的自我修养》,

  1. //《程序员的自我修养》
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int count = 0;
  5. void *p = NULL;
  6. int main(int argc, char *argv[])
  7. {
  8. int blocksize[4] = { 1024 * 1024 * 1024, 1024 * 1024, 1024, 1 };
  9. int i, j;
  10. for (i = 0; i<4; ++i)
  11. {
  12. for (j = 1; ; ++j)
  13. {
  14. if (NULL == (p = malloc(count + blocksize[i])))
  15. {
  16. printf("%d\n", j); break;
  17. }
  18. count += blocksize[i];
  19. free(p);
  20. }
  21. }
  22. printf("mallocmaxmemory:%d\n", count);
  23. return 0;
  24. }

下面是来自知乎的讲解:

        地址空间限制是有的,但是malloc通常情况下申请到的空间达不到地址空间上限。内存碎片会影响到你“一次”申请到的最大内存空间。比如你有10M空间,申请两次2M,一次1M,一次5M没有问题。但如果你申请两次2M,一次4M,一次1M,释放4M,那么剩下的空间虽然够5M,但是由于已经不是连续的内存区域,malloc也会失败。系统也会限制你的程序使用malloc申请到的最大内存。Windows下32位程序如果单纯看地址空间能有4G左右的内存可用,不过实际上系统会把其中2G的地址留给内核使用,所以你的程序最大能用2G的内存。除去其他开销,你能用malloc申请到的内存只有1.9G左右。

作者:Cascade

链接:https://www.zhihu.com/question/20836462/answer/16341442


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/333367
推荐阅读
相关标签
  

闽ICP备14008679号