11

プログラムのセグメンテーション違反エラーの理由がわかりません。コードはこちらから入手できます

29行PclImage目で、structの配列のようにtypedefで定義された変数を宣言します。PclImageタイプの定義は次のとおりです( src / libMyKinect.hファイルから):

typedef struct {
    int valid;
    float x;
    float y;
    float z;
    unsigned char blue;
    unsigned char green;
    unsigned char red;
} Point3d;

typedef Point3d PclImage[480][640];

プログラムは正常に動作しますが、2番目を宣言するとPclImage、プログラムを起動するとすぐにセグメンテーション違反が発生します。

たとえば、最初のファイルの30行目でPclImage bgPcl;、プログラムを追加するとすぐにクラッシュします。

誰か助けてもらえますか?

4

2 に答える 2

14

を(スタック上の)ローカル変数として宣言するPclImageと、スタックオーバーフローが原因でセグメンテーション違反が発生する可能性があります。

PclImageは307,200個の要素を持つ配列であり、各要素のサイズは(おそらく)約20バイトであるため、配列全体のサイズは約6MBになります。スタックがこれらの配列のうちの2つを含むのに十分な大きさである可能性はほとんどありません。1つを収容するのに十分な大きさではない場合もあります(非常に一般的なルールとして、ほとんどのデスクトップOSでは、少なくとも1MBのスタックスペースが使用可能であると想定するのが通常は安全です)。

このような大きなオブジェクトがある場合は、動的に(mallocおよびフレンドを使用して)割り当てるか、再入可能性を考慮しない場合は静的に割り当てる必要があります。

于 2010-12-28T16:22:57.607 に答える
1

スタックにこれらの大きな配列を割り当てることが原因である可能性が最も高いというJamesに同意します。ただし、それぞれを合計すると、それぞれPclImage約6Megになります。限られたメモリ環境で操作している場合を除いて、これは実行可能です。以前、スタックにはるかに大きな配列を割り当てました。組み込みシステムでも。

ジェームズの使用の提案はmallocおそらくそれを修正するでしょう(問題を確認するためだけに試す価値があります)。ただし、可能な場合は動的割り当てを回避することをお勧めします。mallocの可能な代替手段は、外部コンテキストで配列を宣言するか、スレッドのスタックサイズを増やすことです。ユーザーが作成したプロセスやスレッドには、デフォルトでかなり小さなスタックが割り当てられていることがよくあります。それがどこに設定されているかを見つけて、ニーズに十分な大きさのスタックを与えるのは、かなり簡単なことです。

たとえば、これがWindowsCreateThread()ルーチンで作成されたスレッドから実行される場合、2番目のパラメーターはスタックサイズを制御します。0(ほとんどの人がそうするように)デフォルトでそれを使用する場合、それはデフォルトのスタックサイズを取ります。私が知る限り、それは「たった」1MBです。

于 2010-12-28T16:34:12.550 に答える