4

可能重复:
C 编程,为什么这个大数组声明会产生分段错误?

我写了一个简单的程序。

#include <iostream>

using namespace std;

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

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

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

我怎样才能节省这笔钱int

(我有足够的内存来保存这么多的ints而且我的电脑是64位的)

4

4 回答 4

6

你的堆栈太小了。把它放在堆上,使用新的:

int* genotype = new int[150000000];

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

  • 签名字符:-127 到 127(注意,不是 -128 到 127;这适用于 1 的补码平台)
  • 无符号字符:0 到 255
  • “plain” char:-127 到 127 或 0 到 255(取决于默认的 char 符号)
  • 签名短:-32767 到 32767
  • 无符号短:0 到 65535
  • 有符号整数:-32767 到 32767
  • 无符号整数:0 到 65535
  • 长签名:-2147483647 到 2147483647
  • 无符号长:0 到 4294967295
  • 签名长长:-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();
于 2012-09-19T04:17:54.660 回答
4

作为链接器选项...

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

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

于 2012-09-19T04:24:14.893 回答
2

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

对于 C++,astd::vector将是更好的选择。

#include <iostream>
#include <vector>

using namespace std;

int main(int argc, char* argv[])
{
    vector<int> genotype(150000000);
}
于 2012-09-19T04:17:32.133 回答
1

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

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

于 2012-09-19T04:30:10.213 回答