我正在阅读《专家C编程》一书,但这是令我真正困惑的代码。我无法理解函数malloc的使用及其在此处返回的值,为什么运行此函数将返回在进程中分配的内存? 预先感谢。
#include<stdio.h>
#include<stdlib.h>
main()
{
int MB = 0;
while(malloc(1<<20)) ++MB;
printf("Allocated %d MB total\n",MB);
}
答案 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]);