首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么malloc(1)适用于存储4字节整数?

为什么malloc(1)适用于存储4字节整数?
EN

Stack Overflow用户
提问于 2017-01-24 16:01:38
回答 8查看 6.8K关注 0票数 4

据我所知,malloc(x)返回一个x字节长的内存块。

所以要存储一个4字节的整数,我会这样做:

代码语言:javascript
复制
int *p = (int *)malloc(4);
*p = 100;

因为sizeof(int)为我返回4。

但是,如果我这样做了:

代码语言:javascript
复制
int *p = (int *)malloc(1);
*p = 100;

它的工作原理似乎完全一样,存储值没有任何问题。

为什么使用malloc()请求的内存量似乎无关紧要?一个4字节的整数不应该需要malloc(4)吗?

EN

回答 8

Stack Overflow用户

发布于 2017-01-24 16:03:19

如果这在您的情况下工作,它只是偶然工作,不能保证工作。这是未定义的行为(比较this SO question),任何事情都可能发生。

你期望会发生什么?你的程序崩溃了?

如果您更频繁地调用mallocfree,这种情况仍然可能发生。malloc通常比请求的多占用一些字节,并使用额外的空间进行管理(所有内存块的链表、内存块的大小)。如果您在分配的块之前或之后写入一些字节,那么您很可能会扰乱内部管理结构,随后freemalloc将崩溃。

如果malloc在内部总是分配最少的n字节,那么你的程序可能只会在你访问字节n+1时崩溃,而且操作系统通常只基于页来保护内存。如果一个页面的大小为512字节,而您的malloc字节位于页面的中间,那么您的进程可能能够读写该页面的其余部分,并且只会在访问下一个内存页面时崩溃。但请记住:即使这是有效的,它也是未定义的行为。

票数 4
EN

Stack Overflow用户

发布于 2017-01-24 16:36:08

malloc作为来自C运行时或操作系统内核的所有内存块分配函数都针对内存访问和对象对齐进行了优化。

此外,malloc具体地说,在所分配的空间之前分配隐藏的控制块以跟踪分配(所需的空间、分配的空间等)。

malloc 还必须保证所分配的存储器地址对于任何存储对象都是适当对齐的,这意味着该块将开始于8、16、32甚至64或128字节的边界,这取决于处理器,并且通常来自硬件(即,一些特殊的MMU)。边界也取决于访问速度,一些处理器对不同的内存访问有不同的行为(1,2,4,8,...字节)和地址边界。此约束驱动malloc代码规范和分配器逻辑内存块分区。

在实际方面,让我们考虑一个用于X86处理器的分配器,它通常返回一个在8字节边界(32位代码)上对齐的块,这对于整型、浮点型甚至双精度型都很有用。为此,malloc将可用内存划分为“块”,即最小的分配空间。当你分配1个字节时,这个函数至少会分配一个块。最终,这个块可以容纳一个整数,甚至是一个双精度的,但它依赖于实现,您不能认为它是确定性的,因为在同一函数的未来版本中,行为可能会改变。

现在,我希望这是很清楚的,因为您的代码似乎可以工作,请记住,这是未定义的行为,您必须为该保留它。它现在可以工作,而不是在下一个版本中,它可以在一些硬件上崩溃,而不是在另一个处理器或机器上崩溃。

票数 3
EN

Stack Overflow用户

发布于 2019-01-30 02:15:27

为此,我们应该知道malloc函数在内部是如何工作的。为了动态地分配内存,每个操作系统都使用系统调用。我们可以使用这些系统调用动态分配内存。这些系统调用在不同的操作系统之间是不同的。

因此,一个操作系统的系统调用可能不适用于另一个操作系统。此外,如果我们使用系统调用来动态分配内存,那么我们的程序将与平台相关。所以为了避免这种依赖,我们使用malloc函数。现在,malloc函数负责根据操作系统进行适当的系统调用,以动态分配内存。

因此malloc本身会调用系统调用,这将是一个非常慢的过程,因为每次我们请求动态内存时,它都必须使用系统调用。为了避免这种情况,每当我们请求动态内存时,它通常会分配额外的内存,以便下次可以避免系统调用,并且可以使用先前分配的内存的剩余块。这就是为什么你的程序工作,因为malloc分配额外的内存。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41822904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档