C 大小为LONG_MAX的数组

C 大小为LONG_MAX的数组,c,arrays,limits,variable-declaration,C,Arrays,Limits,Variable Declaration,我需要声明一个大小为LONG_MAX的数组(2147483647,在c库中),我确实需要它来解决问题。但是代码给了我错误:如果我写longint v[long_MAX]编译器给出的数组“v”的大小太大。 如何解决这个问题?在几乎所有存在的系统上,声明为具有固定大小的本地数组的变量都放在堆栈上 C标准(5.2.4.1)仅保证在操作系统上运行的程序能够保存大小为65535字节的对象。不管标准怎么说,操作系统都会为您的进程设置堆栈限制 如果声明的对象太大,就C标准而言,就会出现所描述的编译器错误。否则

我需要声明一个大小为LONG_MAX的数组(2147483647,在c库中
),我确实需要它来解决问题。但是代码给了我错误:如果我写
longint v[long_MAX]
编译器给出的
数组“v”的大小太大

如何解决这个问题?

在几乎所有存在的系统上,声明为具有固定大小的本地数组的变量都放在堆栈上

C标准(5.2.4.1)仅保证在操作系统上运行的程序能够保存大小为65535字节的对象。不管标准怎么说,操作系统都会为您的进程设置堆栈限制

如果声明的对象太大,就C标准而言,就会出现所描述的编译器错误。否则,如果您通过了该检查,但仍然使用了太多的堆栈,以及嵌套的函数调用等,则会出现运行时错误:堆栈溢出


解决此问题的首选方法是始终使用动态内存分配来分配大型对象。然后在堆上分配对象,计算机的RAM几乎设置了限制。

在几乎所有存在的系统上,声明为具有固定大小的本地数组的变量都放置在堆栈上

C标准(5.2.4.1)仅保证在操作系统上运行的程序能够保存大小为65535字节的对象。不管标准怎么说,操作系统都会为您的进程设置堆栈限制

如果声明的对象太大,就C标准而言,就会出现所描述的编译器错误。否则,如果您通过了该检查,但仍然使用了太多的堆栈,以及嵌套的函数调用等,则会出现运行时错误:堆栈溢出


解决此问题的首选方法是始终使用动态内存分配来分配大型对象。然后在堆上分配对象,计算机的RAM几乎设置了限制。

如果必须使用系统不允许分配的如此大的内存,可以使用内存映射

fd=open(name, flag, mode); 
if(fd<0) 
   ... 
ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0);

// use the virtual memory that ptr pointed to, like what you do with arrays.
...

munmap( p_map, len); 
fd=open(名称、标志、模式);

如果(fd如果您必须使用系统不允许分配的如此大的内存,您可以使用内存映射

fd=open(name, flag, mode); 
if(fd<0) 
   ... 
ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0);

// use the virtual memory that ptr pointed to, like what you do with arrays.
...

munmap( p_map, len); 
fd=open(名称、标志、模式);

如果您试图分配2GB x
sizeof(无论什么)
。您认为这将如何工作?我可以向您保证,您不需要太多空间来解决您的问题。因为这将导致堆栈溢出。它应该是某种映射吗?对于32位构建,假设sizeof(long int)==4,这将是8GB的数据。这甚至不适合进程的地址空间。(对于8字节长的64位,这简直是难以置信的大。)您正试图分配2GB x
sizeof(无论什么)
。您认为这将如何工作?我可以向您保证,您不需要太多空间来解决问题。因为这将导致堆栈溢出。它应该是某种映射吗?对于32位构建,假设sizeof(long int)==4,这将是8GB的数据。这甚至不适合您进程的地址空间。(对于长度为8字节的64位,这个数字大得令人难以置信。)