使用以下代码,我试图创建一个数字数组,然后对它们进行排序。但是如果我设置一个高数组大小(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;
}
答案 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);