2010-11-25 6 views
0

2 * n個の分数を保持できる動的配列を作成する必要があります。 動的配列を割り当てることができない場合は、メッセージを出力し、exit(1)を呼び出します。 次に、分子数 が1と20の間にある縮小乱数で配列を塗りつぶします。その初期分母が2と20(両端を含む)との間にある。分数配列を作成する

分数を作成して縮小する関数を準備しました。これは私が得たものです。このプログラムをコンパイルして実行すると、クラッシュして、なぜその理由がわからないのですか?私がtest.cに10の代わりに1を入れると、クラッシュすることはありませんが、それは私に狂った部分を与えます。私がtest.cに7,8、または11を置くと、クラッシュします。誰かが私を助けることができるなら、私は感謝します。

FractionSumTester.c

Fraction randomFraction(int minNum, int minDenom, int max) 
{ 
    Fraction l; 
    Fraction m; 
    Fraction f; 

    l.numerator = randomInt(minNum, max); 
    l.denominator = randomInt(minDenom, max); 

    m = reduceFraction(l); 

while (m.denominator <= 1) 
    { 
     l.numerator = randomInt(minNum, max); 
    l.denominator = randomInt(minDenom, max); 
    m = reduceFraction(l); 
    } 
    return m; 


} 


Fraction *createFractionArray(int n) 
{ 
    Fraction *p; 
    int i; 


    p = malloc(n * sizeof(Fraction)); 

    if (p == NULL) 
    { 
    printf("error"); 
    exit(1); 
    } 

    for(i=0; i < 2*n ; i++) 
    { 

     p[i] = randomFraction(1,2,20); 
     printf("%d/%d\n", p[i].numerator, p[i].denominator); 


    } 

    return p; 


} 

これは、私は、この二つの機能をテストするために使用していますものです。 n個のアイテムのごcreateFractionArray()関数で、あなたのmalloc()の空間には

test.cの

#include "Fraction.h" 
#include "FractionSumTester.h" 
#include <stdio.h> 


int main() 
{ 

     createFractionArray(10); 

    return 0; 
} 
+0

ほとんどのLinuxシステムでは、メモリオーバーコミット(http://opsmonkey.blogspot.com/2007/01/linux-memory-overcommit.html)が要求されたメモリを提供するため、mallocは常に成功することに注意してくださいあなたがそれを使用しようとするまで、実際には割り当てません。私はこれがクラスのためのものだと確信していますので、これについて心配する必要はありませんが、 – Falmarri

答えて

1

。次に、forループでは、2 * n個の項目をそのスペースに書き込んでいます。バッファーをオーバーランしてクラッシュが発生します。

+0

のために導入されたあらゆる種類のバグがあるので、心に留めておきましょう。 p = malloc((2 * n)* sizeof(Fraction))を入れてください –

+0

ありがとうございました。それは私がすべてを試みたが、私はそれについて考えたことはありません。ありがとうございました。 –

+0

createFractionArray()で2 * nの小数を作成する場合は、変更は正しいです。あなたのmalloc()を同じに保ち、あなたのforループを 'for(i = 0; i Jander

関連する問題