gpt4 book ai didi

c - 当 "char bigchar[ 1u << 31 - 1 ];"工作正常时,为什么我应该使用 malloc()?

转载 作者:太空狗 更新时间:2023-10-29 17:04:23 24 4
gpt4 key购买 nike

与静态数组相比,使用 malloc(除了失败时返回 NULL 之外)有什么优势?以下程序将吃掉我所有的 ram 并仅在循环未被注释时才开始填充交换。它不会崩溃。

...

#include <stdio.h>

unsigned int bigint[ 1u << 29 - 1 ];
unsigned char bigchar[ 1u << 31 - 1 ];

int main (int argc, char **argv) {
int i;
/* for (i = 0; i < 1u << 29 - 1; i++) bigint[i] = i; */
/* for (i = 0; i < 1u << 31 - 1; i++) bigchar[i] = i & 0xFF; */

getchar();
return 0;
}

...

经过反复试验,我发现上面是我的 32 位 Intel 机器上 GCC 4.3 允许的最大静态数组。这是标准限制、编译器限制还是机器限制?显然,我想要多少就可以拥有多少。它会出现段错误,但前提是我要求(并尝试使用)比 malloc 无论如何都会给我的更多。

有没有办法确定静态数组是否实际分配并且可以安全使用?

编辑:我对为什么使用 malloc 来管理堆而不是让虚拟内存系统来处理它很感兴趣。显然,我可以将数组的大小设置为我认为需要的大小的许多倍,并且虚拟内存系统只会将需要的内容保存在 ram 中。如果我从不写信给例如这些巨大数组的末尾(或开始)则程序不使用物理内存。此外,如果我可以写入每个位置,那么除了在堆中递增指针或在同一进程中搜索之前的分配之外,malloc 还能做什么?

编者注: 1 << 31 causes undefined behaviour如果 int 是 32 位的,那么我将问题修改为 1u .该问题的目的是询问有关分配大型静态缓冲区的问题。

最佳答案

嗯,有两个原因:

  1. 因为可移植性,因为某些系统不会为您进行虚拟内存管理。

  2. 你不可避免地需要将这个数组分成更小的 block 以便它有用,然后跟踪所有 block ,然后最终当你开始“释放”数组的一些 block 时你没有不再需要你会遇到 memory fragmentation 的问题.

总而言之,您将最终实现大量内存管理功能(实际上几乎是重新实现 malloc)而没有可移植性的好处。

因此原因:

  • 通过内存管理封装和标准化实现代码可移植性。

  • 通过代码重用的方式提高个人生产力。

关于c - 当 "char bigchar[ 1u << 31 - 1 ];"工作正常时,为什么我应该使用 malloc()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/839291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com