-1
#include <stdio.h>
#include <stdlib.h>
#include "frac_heap.h"

#define ARRAYSIZE 10
#define ENDOFARRAY 999

fraction heap[ARRAYSIZE] = {0};
block freeBlocks[ARRAYSIZE] = {0};
int startingBlock = 0;
int nextFree = 0;
fraction* fracPointers[][ARRAYSIZE] = {0};
block* blockPointers[][ARRAYSIZE] = {0};

void init_Heap(){
    int x;
    for(x = 0; x < ARRAYSIZE; x ++){    
        block *currBlock = &freeBlocks[x];
        currBlock->isFree = 1;  
        fraction *fractionPointer = &heap[x];
        if(x<ARRAYSIZE - 1){
            fractionPointer->denominator = x+1;
        }
        else if(x == ARRAYSIZE - 1){
            fractionPointer->denominator = ENDOFARRAY;
        }
    }
}

void dump_heap(){
    int x;
    for(x = 0; x < ARRAYSIZE; x ++){
        fraction* tempFrac = &heap[x];
        printf("%d\t%d\t%d\n",tempFrac->sign, tempFrac->numerator, tempFrac->denominator);
    }   
}

fraction* new_frac(){

    fraction* testFraction = &heap[0];
    if(testFraction->numerator == 0 && testFraction ->denominator==0){
        printf("Before return");        
        return testFraction;
    }
}

int main(){

    init_Heap();
    dump_heap();
    fraction *p1;
    p1 = new_frac();
    p1->sign = -1;
    p1->numerator  = 2;
    p1->denominator = 3;
    dump_heap();
   }

new_frac() を呼び出そうとすると、セグメンテーション違反が発生します。この時点でコードをテストしているだけで、testfraction が常に = &heap[0]; になるとは限らないことに気付きました。しかし、「->」で指している構造体の部分にアクセスできたと思いましたか?

もう少し編集した後、testFraction->分母に達したときにのみsegfaultするようです。分母のみをチェックすると、セグメンテーション違反が発生しますが、分子だけで問題なく動作します。

4

1 に答える 1

3

問題は、すべてのコード パスがnew_frac()実際に値を返すわけではないことです。次に、この潜在的に初期化されていないポインターを介して割り当てに進みます。

p1 = new_frac();
p1->sign = -1;
p1->numerator  = 2;
p1->denominator = 3;
于 2013-04-10T06:59:27.390 に答える