2010-11-18 14 views
1

私は現在Cでプログラミングすることを学んでいます。割り当てのタスクの1つでは、テキストファイルの文字数を測定するヒストグラム(これは基本的なコンソール出力で描画されます:http://img703.imageshack.us/img703/448/histogram.jpg)を作成する必要がありますこの割り当ての標準は1.3 MBです)。私はこのような機能を作った:この機能でCでメモリリークが発生しましたか?

int *yAxisAverageMethod(int average, int max, int min) 
{ 
    int *yAxis; 
    int i=0; 
    for (i=0;i<20;i++) 
    { 
     *(yAxis+i)=0; 
    } 
/* 
    int length=sizeof(data)/sizeof(int); 
*/ 
    int lower_half_interval=average/10; 
    int upper_half_interval=(max-average)/10; 
    int current_y_value=min; 
     for (i=0;i<11;i++) 
     { 
      if (i==10){ 
       *(yAxis+10)=average; 
       break; 
      } 
      *(yAxis+i)=current_y_value; 
      current_y_value+=lower_half_interval;    
     } 
    current_y_value+=average+upper_half_interval; 
    printf("Current y value:%d\n",current_y_value); 
    printf("Current max value:%d\n",max); 
     for (i=11;i<20;i++) 
     { 
       *(yAxis+i)=current_y_value; 
       current_y_value+=upper_half_interval; 
     } 

    return yAxis; 
} 

、Iはy軸を作るために、20個の整数の配列を返すつもり。私はすべての文字の平均を見つけ、それを表示するためにコンソールの20行を使用しました。下の10行は、文字の総量の平均値より低い値を表示するために使用され、10行は、上の部分を表示するために使用されます。下半分のy軸の各ステップは(平均 - 最小)/ 10で計算され、上部のy軸の各ステップは(最大 - 平均)/ 10によって計算されます。これはヒストグラムを描画する私の方法です。値の間にバリアントを表示したいからです。 mainメソッドで

、私は、この関数呼び出しがあります。私は、関数を実行したとき、私はセグメンテーションフォールトを得た

int *yAxis; 
yAxis=yAxisAverageMethod(average,max,min); 

を。ネットバンGCC++コンパイラでは、うまく動作します。 Howerver、大学のマシン(コマンドラインでコンパイルしてViで編集しなければならない)で実行したとき、私はエラーを受けました。 Netbeanには独自のメモリマネージャがあるので、それはそうだと思いますか?わかりません。

編集:私はマージソートについてお答えします。

+0

別の質問にマージソートの部分を分割すると、混乱するだけです。 –

+0

あなたは学習しているので、文章的なコメント:コードをインデントする方法を知っているまともなエディタを使用してください。あなたの 'for'ループが字下げされている方法は、読みづらいものです。 – nmichaels

+0

いいえ、Netbeansにはメモリマネージャはありません。しかし、本当にそれらの関数ポインタが必要ですか?はいの場合は、少なくとも "int * yAxisAverageMethod(...)"の関数宣言を変更する必要があります。これは非常に珍しい構文です。しかし、メモリリークを見つけるためにvalgrind(memcheck)をチェックすることができます。あなたがC/C++でプログラムするならば、valgrindに心地よくなることは、とにかくいい考えです。;-) – Philip

答えて

2

* yAxisはワイルドポインタです。使用するint配列のメモリは決して割り当てません。

int *yAxis = malloc(sizeof(int) * 20); 
+0

余分な感謝!できます!また、私はまだそれをマージソートで動作させる必要があります。 – Amumu

+0

私のnetbeanコンパイラは動くことができますが、私の大学のマシンではできない理由はまだ分かりません。 – Amumu

+1

これは簡単です。オペレーティングシステムに依存し、異なるシステムが異なる方法でメモリを扱います。(おそらく)コンパイラだけではありません。すべてのコンパイラで、未定義の場所を指していたポインタがあり、その場所に書き込んでいました。その場所が有効なメモリであった場合、多くのOSはそこに書き込むことを許可し、そこにあったものを上書きします。これは非常に厄介なバグの一般的な原因です。保護されたメモリを持つシステムでは、そこにビジネス上の記述がないことがわかるため、例外がスローされます。 Cでは、これらの低レベルのものに対処する必要があります... – 0xDEADBEEF

1

ポインタは何も返されません。

ここで、* yAxisのメモリを予約するようコンピュータに指示していますか?

+0

ありがとうございます。それは役に立ちます。 – Amumu

0

yAxisはポイントであり、初期化していません。コンパイラに依存するものは未知の領域を指します。最初にいくつかのメモリを適用する必要があります。

yAxis = malloc(sizeof(int)*20);

0

は、呼び出し側で)(それを解放することを忘れないでください。

関連する問題