4

重複の可能性:
C プログラミング、この大きな配列宣言がセグメンテーション違反を引き起こすのはなぜですか?

簡単なプログラムを書きました。

#include <iostream>

using namespace std;

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

しかし、奇妙なエラーが発生します:

RUN FAILED (終了値 1、合計時間: 131ms)

どうすればこの量を節約できintますか?

(この量の s を保存するのに十分なメモリがintあり、私のコンピューターは 64 ビットです)

4

4 に答える 4

6

スタックが小さすぎます。new を使用して、これをヒープに置きます。

int* genotype = new int[150000000];

そして、以下が役立つことを願っています。

  • signed char: -127 から 127 (-128 から 127 ではないことに注意してください。これは 1 の補数プラットフォームに対応します)
  • 符号なし文字: 0 ~ 255
  • "plain" char: -127 から 127 または 0 から 255 (デフォルトの文字符号に依存)
  • 符号付き短縮: -32767 ~ 32767
  • unsigned short: 0 ~ 65535
  • 符号付き整数: -32767 ~ 32767
  • 符号なし整数: 0 ~ 65535
  • 符号付きロング: -2147483647 ~ 2147483647
  • unsigned long: 0 ~ 4294967295
  • 署名された long long: -9223372036854775807 から 9223372036854775807
  • unsigned long long: 0 ~ 18446744073709551615

または、 limit.h を使用して、プログラムが何に依存しているかを調べることができます。たとえば、これは int の最大範囲を見つける方法です。

子:

#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++ の場合は、std::vectora の方が適しています。

#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 に答える