【问题标题】:Maximum size of int array? [duplicate]int数组的最大大小? [复制]
【发布时间】:2012-09-11 09:27:21
【问题描述】:

可能重复:
C programming, why does this large array declaration produce a segmentation fault?

我写了一个简单的程序。

#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    int genotype[150000000];
}

但我得到一个奇怪的错误:

RUN FAILED(退出值1,总时间:131ms)

我怎样才能保存这么多的int

(我有足够的内存来保存这个数量的ints,而且我的电脑是 64 位的)

【问题讨论】:

  • 对于可怜的堆栈来说,这是很多数据。
  • 确实,改为在堆上分配(使用mallocnew[]
  • @KeithRandall, std::vector&lt;int&gt; genotype(150000000);
  • @GregHewgill 是的,看起来像......但是新用户如何找到不同标题的它
  • @RegisteredUser:通过 close-as-duplicate 机制,使用许多不同措辞的问题都可以指向回答基本问题的同一个问题。通过记录这些重复项,谷歌和网站搜索可以帮助用户使用许多不同的搜索词找到现有的好答案。关闭重复不是对提问者的警告,但它是网站发展的自然部分。

标签: c++ c


【解决方案1】:

你的堆栈太小了。使用 new 将其放在堆上:

int* genotype = new int[150000000];

我希望以下内容会有所帮助。

  • signed char:-127 到 127(注意,不是 -128 到 127;这适用于 1 的补码平台)
  • 无符号字符:0 到 255
  • “普通”字符:-127 到 127 或 0 到 255(取决于默认字符符号)
  • 签名短:-32767 到 32767
  • 无符号短:0 到 65535
  • 有符号整数:-32767 到 32767
  • 无符号整数:0 到 65535
  • 签名长:-2147483647 到 2147483647
  • 无符号长:0 到 4294967295
  • signed long long:-9223372036854775807 到 9223372036854775807
  • unsigned long long: 0 到 18446744073709551615

或者您可以使用 limit.h 来了解您的程序所依赖的内容。 例如,您将通过以下方式找到 int 的最大范围:

C:

#include <limits.h>
const int min_int = INT_MIN;
const int max_int = INT_MAX;

C++

#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();

【讨论】:

  • 大部分值范围都没有保证。
  • 尽管如此,当你完成它时,删除[]那个坏男孩。
【解决方案2】:

作为链接器选项...

/STACK 601048576 //  150000000 * 4 (assume size of int), and 1Mb for general.

但是,嘿.. 不要这样做。我什至不确定会发生什么。

【讨论】:

    【解决方案3】:

    您在堆栈上分配它,这比堆或静态存储更受限制。

    对于 C++,std::vector 会是更好的选择。

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
        vector<int> genotype(150000000);
    }
    

    【讨论】:

      【解决方案4】:

      如果您想使用动态内存,只需声明一个指向您要在这种情况下分配的类型 int 的指针,然后调用 malloc() 函数,参数是您希望“数组”成为的字节数。在这种情况下,您需要获取单个整数的大小并将其乘以您想要的大小(即单元格的数量):

      确保释放任何你 malloc 的东西,否则你会得到内存泄漏。

      【讨论】:

      • 由于该问题被标记为 C 和 C++,您可能需要提及使用 new[]delete[] 的替代方法。
      猜你喜欢
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 2012-12-20
      相关资源
      最近更新 更多