2010-11-25 5 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; 


} 

이 나는이 두 가지 기능을 테스트하는 데 사용하고 무엇이다. 당신의 createFractionArray에서

TEST.C

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


int main() 
{ 

     createFractionArray(10); 

    return 0; 
} 
+0

당신은 대부분의 리눅스 시스템에서 점에 유의해야한다 malloc에 ​​항상 메모리 오버 커밋이 (http://opsmonkey.blogspot.com/2007/01/linux-memory-overcommit.html) 당신에게 요청 된 메모리를 제공하기 때문에 성공 만합니다 실제로 사용하려고 할 때까지 실제로 할당하지 않습니다. 이것이 클래스에 대한 것이므로 걱정할 필요가 없습니다. 그러나 이것 때문에 도입 된 모든 종류의 버그가있을 수 있으므로 마음에 두는 것이 좋습니다. – Falmarri

답변

1

() 함수, n 개의 항목에 대한 당신의 malloc() 공간. 그런 다음 for 루프에서 2 * n 항목을 해당 공간에 씁니다. 그러면 버퍼가 오버런되어 충돌이 발생합니다.

+0

그래서 n을 넣는 대신. p = malloc (2 * n) * sizeof (Fraction)을 넣어야합니까 –

+0

정말 고마워요. 그것은 모든 것을 시도했지만 결코 그것에 대해서는 생각하지 않았습니다. 다시 감사합니다. –

+0

createFractionArray()로 2 * n 분수를 만들려면 변경 사항이 정확해야합니다. malloc()을 동일하게 유지하고 for 루프를 for (i = 0; i Jander