4

可以从程序分配的内存量是否有限制?我的意思是,对于程序是否有任何保护,例如,在无限循环中分配内存?

何时调用malloc()返回 NULL 指针?

4

4 回答 4

8

是的,有一个限制。该限制取决于许多因素,包括(但不限于):

  • 程序的指令集(例如,32 位二进制文​​件的地址空间比 64 位二进制文​​件小)。
  • 系统有多少可用内存。(这里的“内存”包括虚拟内存。)
  • 系统管理员或特权进程设置的任何人为限制(例如,参见setrlimit()(过时的)ulimit()函数)。

当内存无法分配时,malloc()将返回NULL。如果系统完全内存不足,您的进程可能会被强制终止。

于 2013-09-11T19:39:10.717 回答
5

来自维基百科

可以分配的最大内存块malloc取决于主机系统,尤其是物理内存的大小和操作系统的实现。理论上,最大数应该是一个类型中可以保存的最大值size_t,它是一个依赖于实现的无符号整数,表示内存区域的大小。最大值为 2 ,即 C99 标准中的常数。CHAR_BIT × sizeof(size_t) − 1SIZE_MAX

于 2013-09-11T19:39:04.653 回答
3

它取决于操作系统和标准库。

在 Linux 上,

  • 当你用完地址空间时,malloc()将返回NULL.

  • 当物理内存和交换空间都用完时,OOM 杀手将运行并杀死一个进程以释放内存。

于 2013-09-11T19:37:21.253 回答
0

我正在反向解决这个问题。请参阅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
于 2021-10-22T09:07:42.033 回答