【问题标题】:How to solve Memory Limit in C [closed]如何解决 C 中的内存限制 [关闭]
【发布时间】:2021-12-20 00:29:24
【问题描述】:

我遇到了约束必须为 10e9 的问题,但每次我运行代码时,它总是导致内存限制,是否有办法克服这个问题?

这是我的代码

#include <stdio.h>

int main(){
    
    int arr = 10e9;
    int data[arr];
    int a;
    int n,t;
    
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        int max = 0;
        for(int j = 0; j < arr; j++){
            data[j] = 0;
        }
        
        scanf("%d",&t);
        for(int j = 0; j < t; j++){
            scanf("%d", &a);
            data[a]++;
            if(max < data[a]){
                max = data[a];
            }
        }
        int min = arr;
        for(int k = 0; k < arr; k++){
            
            if(min > k && data[k] == max){
                min = k;
            }
        }
    
        printf("Case #%d: %d\n%d\n", i+1, max,min);
    
        }
        
    return 0;
}

【问题讨论】:

  • 10e9 是一百亿。 int 的大小通常为 4 个字节。所以你试图创建一个 400 亿字节的数组。除非您有一台内存为 64GB 的机器,否则这将无法正常工作。如果您确实有 64GB,那么您应该使用malloc(10e9 * sizeof(int)) 为数组分配内存。
  • ...除非您有一台具有 64GB 虚拟内存的机器。假设交换空间可用,64 位操作系统应该可以处理。
  • 重新考虑你的算法。显然,您应该跟踪数字序列的最小值和最大值。你确定你需要一个数组吗? (提示:你没有。)大概是为了让你为循环计数器选择合适的数据类型。
  • @user3386109:进程的虚拟内存可能超过计算机的物理内存。虚拟内存不必同时映射到物理内存。它可以根据需要换入和换出。

标签: arrays c memory-limit


【解决方案1】:

您不能在堆栈中创建 10e9 int 数组,即 40GB 数组。一个堆栈通常只有 700KB 到 1MB。

如果您的 RAM 确实有超过 40GB 的空间,包括在考虑操作系统和其他后台进程之后,那么您可以使用int *data = malloc(sizeof(int) * 10e4)(不要忘记在末尾使用free(data) 释放它)。 malloc 在堆上分配你的内存,用于存储这么大的东西。

顺便说一句,您的 RAM 必须至少为 64GB 才能正常工作。您的操作系统可能会制作一些硬盘缓存并使其以某种方式运行,但如果您的 RAM 少于 64GB,请不要尝试对您的计算机进行这种攻击。

【讨论】:

    猜你喜欢
    • 2015-12-22
    • 2012-09-28
    • 2022-06-28
    • 2019-10-13
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2012-07-10
    相关资源
    最近更新 更多