为什么可以像这样使用函数malloc?

时间:2019-09-07 02:32:17

标签: c memory malloc

我正在阅读《专家C编程》一书,但这是令我真正困惑的代码。我无法理解函数malloc的使用及其在此处返回的值,为什么运行此函数将返回在进程中分配的内存? 预先感谢。

#include<stdio.h>
#include<stdlib.h>
main()
{
    int MB = 0;
    while(malloc(1<<20))  ++MB;
    printf("Allocated %d MB total\n",MB);
}

2 个答案:

答案 0 :(得分:3)

<<运算符按位左移。因此,这会将二进制1左移20个位置。 即0000 0000 0000 0000 0001变为1000 0000 0000 0000 0000。 因为MB定义为2 ^ 20,所以这相当于1 MB。

因此,每个malloc()调用都会尝试分配1 MB。如果malloc()无法分配那么多空间,它将返回NULL。在C中,NULL将求值为False。

因此,在循环的每次迭代中,程序将分配1 MB。如果成功,它将增加MB计数器。如果malloc()空间不足,它将返回NULL并结束循环。然后,printf语句将显示已分配的内存量。

答案 1 :(得分:1)

unsigned int
A = 1 << 0, //1         byte        2^0     0x00000001  0b00000000000000000000000000000001
B = 1 << 8, //256       byte        2^8     0x00000100  0b00000000000000000000000100000000
C = 1 << 10,//1024      byte 1KB    2^10    0x00000400  0b00000000000000000000010000000000  
D = 1 << 20,//1048576   byte 1MB    2^20    0x00100000  0b00000000000100000000000000000000
E = 1 << 28;//256 e6    byte 1GB/4  2^28    0x10000000  0b00010000000000000000000000000000


const int TOP = 100;//25GB max
void* p[TOP] = {};
for (int i = 0; i < TOP; i++)           //32 bit system max 2Gb
{
    p[i] = malloc(0x10000000);          //1GB/4  or 256Mb
    //p[i] = malloc(1<<28);
    //p[i] = malloc(E);

    printf("%4d 0x%08x\n", i, p[i]);        //32 bit system
    //printf("%4d 0x%016llx\n", i, p[i]);   //64 bit system
}
for (int i = 0; i < TOP; i++)
    free(p[i]);