C-malloc的最大申请数量会受到哪些因素的影响?

发布于 2016-12-22 03:23:46 字数 49 浏览 1348 评论 4

malloc的最大申请数量会受到哪些因素的影响?每次malloc的最大量是固定的吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

清晨说ぺ晚安 2017-09-30 04:49:50

首先是地址线的位数,曾经看过一本书上面做过实验。在32位的操作系统上,也就是虚拟内存是4G。但是其中2G操作系统用了,这个环境下,不存在动态映射等情况下,可以申请的空间是1.95G。但是如果程序很大,代码区占的地方比较大,或者有些区被动态映射到其他地方了(这个描述的不是很专业 - -)。并且有一些操作系统,为了防止恶意攻击,采取了一种随机地址空间分布的技术,导致进程堆空间变小,可以分配的地方也就少了

夜无邪 2017-08-29 07:34:14

malloc 申请的内存是在堆区的。
堆的大小没有什么具体数值,看机器的运行状况,配置状况而定。
当程序的堆大小确定时,malloc 可以分配的最大大小还是不确定,因为 malloc 必须分配一块连续的空间,这时候可以申请的最大内存是当前堆中最大连续空间的内存大小。
所以,每次 malloc 的最大量是不固定的。

灵芸 2017-07-22 08:14:53

一次申请的最大内存和运行的平台有关系。它申请的是连续内存空间,机器的RAM以及虚拟内存、机器运行的其他程序所使用的内存大小有关。而且每次运行的结果可能都不同。

需要注意的是,malloc的参数类型是size_t,其取值范围是[0,MAX_SIZE]。但是往往实际能够申请到的内存大小远远小于MAX_SIZE。

可以写个程序测试下:

#include <stdio.h>
#include <stdlib.h>

static void *malloc_wrap(size_t size)
{
void *p = malloc(size);
if (p) {
printf("Allocated %lu bytes from %p to %pn", size, p, p + size);
}
else {
printf("Failed to allocated %lu bytesn", size);
}
return p;
}

int main()
{
size_t step = 0x1000000;
size_t size = step;
size_t best = 0;
while (step > 0)
{
void *p = malloc_wrap(size);
if (p) {
free(p);
best = size;
}
else {
step /= 0x10;
}
size += step;
}
void *p = malloc_wrap(best);
if (p) {
//pause();
return 0;
}
else {
return 1;
}
}

运行结果:

甜柠檬 2017-05-05 06:51:28

malloc分配内存的具体数值会受到操作系统版本、程序本身大小、用到的动态/共享库数量、大小、程序栈数量、大小等,甚至有可能每次运行的结果都会不同。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文