2010-11-25 61 views
0

我必須創建一個能夠保存2 * n分數的動態數組。 如果無法分配動態數組,則會打印一條消息並調用exit(1)。 接下來用減小的隨機分數填充陣列,其分子 介於1和20之間(含);並且其初始分母 介於2和20之間(含)。創建一個分數陣列

我準備好了要創建分數並減少它的函數。這是我得到的。當我編譯並運行這個程序時,它崩潰了,我找不到原因。如果我在test.c中放置1而不是10,它不會崩潰,但它會給我一個瘋狂的分數。如果我在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; 


} 

這是我使用來測試此兩項功能是什麼。

test.c的

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


int main() 
{ 

     createFractionArray(10); 

    return 0; 
} 
+0

你應該注意到,在大多數linux系統上,malloc總是會成功,因爲內存過量使用(http://opsmonkey.blogspot.com/2007/01/linux-memory-overcommit.html)會給你請求的內存,但直到你嘗試使用它纔會真正分配它。我相信這是爲了一個班級,所以你不必擔心這個問題,但要記住,因爲可能會引入各種各樣的錯誤,因爲這個 – Falmarri 2010-11-25 18:21:48

回答

1

在你createFractionArray()函數,對於n的項目,你的malloc()的空間。然後,在for循環中,您將2 * n個項目寫入該空間......這會超出緩衝區並導致崩潰。

+0

因此,而不是隻把n放在一起。我應該把p = malloc((2 * n)* sizeof(Fraction)) – 2010-11-25 18:07:35