可以从程序分配的内存量是否有限制?我的意思是,对于程序是否有任何保护,例如,在无限循环中分配内存?
何时调用malloc()
返回 NULL 指针?
是的,有一个限制。该限制取决于许多因素,包括(但不限于):
setrlimit()
(过时的)ulimit()
函数)。当内存无法分配时,malloc()
将返回NULL
。如果系统完全内存不足,您的进程可能会被强制终止。
来自维基百科,
可以分配的最大内存块
malloc
取决于主机系统,尤其是物理内存的大小和操作系统的实现。理论上,最大数应该是一个类型中可以保存的最大值size_t
,它是一个依赖于实现的无符号整数,表示内存区域的大小。最大值为 2 ,即 C99 标准中的常数。CHAR_BIT × sizeof(size_t)
− 1
SIZE_MAX
它取决于操作系统和标准库。
在 Linux 上,
当你用完地址空间时,malloc()
将返回NULL
.
当物理内存和交换空间都用完时,OOM 杀手将运行并杀死一个进程以释放内存。
我正在反向解决这个问题。请参阅pointer
存储内存块的地址。如果我们能够找到它可以存储的最大地址,那么我们就可以找到分配给我们程序的内存。
代码
#include <stdio.h>
int main()
{
void *p;
printf("%zu",sizeof(p));
return 0;
}
输出
8
理解:
pointer size is 8 bytes.
8 bytes -> 64 bits
Max address it can store/ last memory block address: 2^64-1
Memory block addresses: 0, 1, 2, 3, ... 2^64-1
Memory allocated to program: 2^64 byte