malloc()打破循环

时间:2012-11-02 20:48:04

标签: c heap

为什么下面的代码直接显示Mb占用的堆:

int Mb = 0;
while ( malloc(1<<20)) ++Mb;
printf("Allocated %d Mb total\n", Mb);

1<<20是什么意思?

6 个答案:

答案 0 :(得分:6)

  

1<<20是什么意思?

A 1,向左移动20位,也称为2 ^ 20 = 1048576. <<是向左移位的位移运算符。

答案 1 :(得分:6)

这意味着2^20是1 MB。所以它计算MB的数量

答案 2 :(得分:2)

这是一个按位左移操作员。这意味着它占了一位(例如二进制00000001,除了31前导0)然后将该位移到20位置,留下2 ^ 20。

答案 3 :(得分:0)

在具有虚拟内存的现代操作系统上(例如大多数Unix,Linux,Windows),此代码实际上会向您显示虚拟内存大小的限制或过度使用限制(以先到者为准),而不是堆分配尺寸。它不断地分配更多的内存而不触及它,在这样做的同时创建一个小的内存泄漏(除非malloc是预先初始化已分配内存的调试变体之一;然后,如果在Linux上运行,OOM杀手可能会杀死它甚至在它到达printf

之前

在没有虚拟内存的(可能是现代的)操作系统上,它会显示在系统内存不足之前可以分配多少内存,而且一切都会崩溃并且不合理地烧毁。

答案 4 :(得分:0)

每次更改时都会打印MB的值

  

int Mb = 0;

     
    

while(malloc(1 <&lt; 20))

         
      

printf(“Allocated%d Mb total \ n”,++ Mb);

    
  

1&lt;&lt; 20是1兆字节的值(例如表示2 ^ 20):http://en.wikipedia.org/wiki/Megabyte

答案 5 :(得分:0)

关于“为什么下面的代码直接显示Mb占用的堆”

int Mb = 0;
while ( malloc(1<<20)) ++Mb;
printf("Allocated %d Mb total\n", Mb);
What is meant by 1<<20?

您正在计算malloc()在尝试分配1MB(2 ^ 20字节,其他答案讨论移位运算符)时返回非空值的次数。动态保留内存在堆中分配,因此它计算堆可用的MB数。

虽然我不确定这种估计的精确度,但是因为malloc不只是将指针移动到精确指示的大小。