2011-08-05 8 views
1

次のコードを使用してセグメンテーションが継続します。 4000を1000に変更すると、コードは正常に動作します。私はここに十分な記憶があると思います...どうすればこの問題を解決できますか?小(ish)2d配列のセグメンテーションフォルト

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAXLEN 4000 

void initialize_mx(float mx[][MAXLEN]) 
{ 
    int i, j; 
    float c=0; 
    for(i=0;i<MAXLEN;i++){ 
    for(j=0;j<MAXLEN;j++) mx[i][j]=c; 
    } 
} 
int main(int ac, char *av[]) 
{ 
    int i, j; 
    float confmx[MAXLEN][MAXLEN]; 
    initialize_mx(confmx); 
    return 0; 
} 
+0

@berry:配列型をmallocで初期化することはできません。ポインタ型のみを初期化することはできません。 –

+0

@Dietrich Epp申し訳ありませんが、あなたはもちろん気になります。私のCがどのくらい錆びているのかを示しています(なぜ、疲れたときに特別なコメントを投稿してはいけないのですか?) – berry120

答えて

3

問題はスタックがオーバーフローしていることです。

initialize_mx()を呼び出すと、ローカル変数(あなたの場合はconfmx)にスタックスペースが割り当てられます。あなたのOS(Linux上であればulimitをチェック)によって制限されるこのスペースは、ローカル変数が大きすぎるとオーバーフローする可能性があります。

基本的に次のことができます。cnicutarが示唆するように、グローバル変数として

  1. 宣言confmx。
  2. Allocate memory space for your array dynamically.initialize_mx()

EDITへのポインタを渡す:ちょうどあなたがポインタを渡す場合は、これらの2つのオプションがありますので、あなたはまだメモリ領域を割り当てる必要があります:)

+2

このサイトはStackOverflowと呼ばれています。

+0

これは私の最初の質問だったので、私は自分の問題を理解するためのガイドとしてリンクしているチュートリアルを使用しました;) – kirbuchi

1

スタックに4000 * 4000 * 4バイトを使用していますが、計算エラーが発生していない場合は61MBと多くなります。この場合、あなたはスタック上でほぼ4MBしか使用していないので、1000で動作します。

1

4000*4000*sizeof(float)==64000000。お使いのオペレーティングシステムには、4〜64 MBのスタックサイズに制限があると思われます。

0

を他の人が小さめISN」を指摘してきたように実現スタック上に割り当てられたautoのクラス変数の場合は、小さい。

は、ニーズに応じて、

static float confmx[MAXLEN][MAXLEN]; 

BSSでストレージを割り当てることになる可能性があります。別のストレージシステムを検討すると、希薄なマトリックスが必要な場合が多く、多くのセルがゼロのマトリックスを保存してアクセスする効率的な方法があります。