C中的最大大小数组程序?

时间:2013-11-25 10:57:19

标签: c

使用以下代码,我试图创建一个数字数组,然后对它们进行排序。但是如果我设置一个高数组大小(MAX),程序将停止在最后“随机”生成的数字,并且根本不会继续排序。有人可以帮我一把吗?

#include <stdio.h>

#define MAX 2000000

int a[MAX];
int rand_seed=10;

/* from K&R
   - returns random number between 0 and 62000.*/
int rand();
int bubble_sort();

int main()
{
    int i;

    /* fill array */
    for (i=0; i < MAX; i++)
    {
        a[i]=rand();
        printf(">%d= %d\n", i, a[i]);
    }

    bubble_sort();

/* print sorted array */
printf("--------------------\n");
for (i=0; i < MAX; i++)
printf("%d\n",a[i]);

    return 0;
}

int rand()
{
    rand_seed = rand_seed * 1103515245 +12345;
    return (unsigned int)(rand_seed / 65536) % 62000;
}

int bubble_sort(void)
{
    int t, x, y;
    /* bubble sort the array */
    for (x=0; x < MAX-1; x++)
        for (y=0; y < MAX-x-1; y++)
            if (a[y] > a[y+1])
            {
                t=a[y];
                a[y]=a[y+1];
                a[y+1]=t;
            }
     return 0;
}

4 个答案:

答案 0 :(得分:4)

问题是你在全局部分存储数组,C不保证它可以支持的全局部分的最大大小,这是OS,arch编译器的一个功能。
因此,不是创建全局数组,而是创建一个全局C指针,使用malloc分配一个大块。现在内存保存在堆中,堆更大,可以在运行时增长。

答案 1 :(得分:1)

您的数组将以BSS section的形式登陆静态变量。它不会成为图像的一部分,但程序加载器将分配所需的空间并在程序开始“真正”执行之前用零填充它。如果使用嵌入式编译器并使用您喜欢的任何内容填充静态数据,您甚至可以控制此过程。这个数组可能占用2GB或你的RAM,但你的exe文件可能是几千字节。我刚刚设法使用超过2GB的数组,我的exe是34KB。我可以相信当你接近2 31 -1个元素时(如果你的int是32位),编译器可能会发出警告,但是现在有2m元素的静态数组不是问题(除非它是嵌入式系统但是我打赌它不是。)

问题可能是你的冒泡排序有2个嵌套循环(因为所有冒泡排序)所以试图对这个数组进行排序 - 有2m个元素 - 导致程序循环 2 * 10 12 次(arithmetic sequence):

  

内循环:

     

1:1999999次

     

2:1999998次

     

...

     

2000000:1次

所以你必须交换元素

  

2000000 *(1999999 + 1)/ 2 =(4/2)* 1000000 2 = 2 * 10 12

(如果我错了,请纠正我)

你的程序在排序例程中只是保持太久而你甚至都不知道。你看到它只是打印的最后兰特号和程序没有响应。即使在我拥有200K阵列的速度很快的PC上,也需要大约1分钟来对它进行排序。

它与您的操作系统,编译器,堆等无关。当您的循环执行 2 * 10 12 时,您的程序停滞不前如果你有2米的元素。

要验证我的单词在排序之前打印“sort started”并在此之后“排序完成”。我打赌你看到的最后一件事就是“排序开始”。此外,您可以在bubble_sort的内部循环之前打印当前 x 值 - 您将看到它正在运行。

答案 2 :(得分:0)

原始C标准(ANSI 1989 / ISO 1990)要求编译器成功转换至少一个包含一组环境限制的示例的程序。其中一个限制是能够创建一个至少32,767字节的对象。

这个最低限制在1999年对C标准的更新中提出至少为65,535字节。

不需要C实现来提供大于该大小的对象,这意味着它们不需要允许大于

的int数组
(int)(65535 / sizeof(int)).

在非常实际的术语中,在现代计算机上,不可能事先说出可以创建多大的数组。它可能取决于计算机中安装的物理内存量,操作系统提供的虚拟内存量,已运行的其他任务,驱动程序和程序的数量以及使用的内存量。因此,您的程序今天可以使用比昨天使用的更多或更少的内存,或者明天可以使用。

许多平台对自动对象施加了最严格的限制,即在不使用'static'关键字的情况下在函数内定义的对象。在某些平台上,如果它们是静态的或通过动态分配,您可以创建更大的数组。

答案 3 :(得分:0)

动态数组

int *Array;
Array= malloc (sizeof(int) * Size);