Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我为什么要使用malloc()呢;char bigchar[1u<;<;31-1]&引用;还好吗?_C_Arrays_Static_Malloc - Fatal编程技术网

我为什么要使用malloc()呢;char bigchar[1u<;<;31-1]&引用;还好吗?

我为什么要使用malloc()呢;char bigchar[1u<;<;31-1]&引用;还好吗?,c,arrays,static,malloc,C,Arrays,Static,Malloc,与静态数组相比,使用malloc(除了失败时返回NULL)有什么优势?下面的程序将耗尽我所有的ram,并且仅当循环未注释时才开始填充交换。它不会崩溃 #包括 unsigned int bigint[1u我想这就是所谓的自定义内存管理。 你可以这样做,但你必须自己管理那块内存。 您将在这个区块上编写自己的malloc()。使用malloc,您可以增加和缩小阵列:它将变得动态,因此您可以精确地分配所需的内容。请参阅: 关于: 经过反复试验,我找到了答案 上面是最大的静态数组 在我的3

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

#包括

unsigned int bigint[1u我想这就是所谓的自定义内存管理。 你可以这样做,但你必须自己管理那块内存。
您将在这个区块上编写自己的malloc()。

使用malloc,您可以增加和缩小阵列:它将变得动态,因此您可以精确地分配所需的内容。

请参阅:

关于:

经过反复试验,我找到了答案 上面是最大的静态数组 在我的32位Intel计算机上允许 对于GCC 4.3,这是一个标准吗 限制、编译器限制或机器 限制


一个上限取决于4GB(32位)的性能虚拟地址空间在用户空间和内核空间之间进行分区。对于Linux,我认为最常见的分区方案有3 GB的用户空间地址范围和1 GB的内核空间地址范围。分区在内核构建时是可配置的,2GB/2GB和1GB/3GB拆分也在使用。当可执行文件已加载的虚拟地址空间必须分配给每个对象,而不管是否分配了实际内存来备份它。

您可能可以在一个上下文中分配那个巨大的数组,但不能在其他上下文中分配。例如,如果您的数组是结构的成员,并且您希望传递该结构。某些环境对str有32K的限制uct大小


如前所述,您还可以调整内存大小,以完全使用所需的内存。在性能关键型环境中,如果可以避免的话,不要分页到虚拟内存非常重要。

除非您知道自己在做什么,否则您确实应该避免这样做。尽量只请求所需的内存。即使不是我们在某些系统上,特别是32位的系统上,它会导致地址空间在极少数情况下过早耗尽。此外,许多内核在保留/虚拟/未使用内存上有某种进程限制。如果程序在运行时请求内存如果内核请求保留超过此限制的内存,则会终止进程。我见过一些程序由于malloc失败而崩溃或退出,因为它们保留了GB的内存,而只使用了几MB。

除了继续运行,没有其他方法可以释放堆栈分配超出范围。因此,当您实际使用全局分配时,VM必须分配给您真正的硬内存,它将被分配并一直保留到程序用完。这意味着任何进程只会在其虚拟内存使用中增长(函数具有本地堆栈分配,这些将被“释放”)

一旦堆栈内存超出函数范围,您就不能“保留”它,因为它总是被释放的。所以您必须知道在编译时将使用多少内存


这可以归结为int foo[1的数量,有两个原因:

  • 由于可移植性,因为有些系统不会为您进行虚拟内存管理

  • 您将不可避免地需要将此数组划分为更小的块以使其有用,然后跟踪所有的块,最后当您开始“释放”数组中不再需要的部分块时,您将遇到以下问题

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

    因此,理由如下:

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

    • 通过代码重用提高个人生产力


    我不认为它是重复的。我会编辑来重新表述这个问题。我读了好几遍,但你对32位指针的范围提出了一个很好的观点。我发现我可以填充两个1。哈哈,我会给你+1作为你在这个答案上投入的时间:PExactly。一般来说,声明你知道你将n的数组是有意义的并将malloc用于只能在运行时确定的存储。
    #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;
    }