0

行に迷惑なバグがあります

rq->tickets[rq->usedContracts] = toAdd;

もしそうなら: rq->tickets[0] = toAddプログラムがクラッシュする

私がやれば rq->tickets[1] = toAdd;うまくいく

ヴァルグリンド 言う

==19501== サイズ 8 の初期化されていない値の使用

==19501== サイズ 8 の無効な書き込み

このまさに一行のために。なにが問題ですか?

    struct TS_element {
    int travels;
    int originalTravels;
    int cost;
    char** dates;
    int moneyLeft;
} TicketSet;

struct RQ_element {
    int usedContracts;

    struct TS_element* tickets;
} RabQav;



TicketSetStatus tsCreate(TicketSet* t, int n, int c) {
    if (n <= 0)
    return TS_ILLEGAL_PARAMETER;
    TicketSet* myTicketSet = (TicketSet*) malloc(sizeof(TicketSet));
    if (myTicketSet == NULL) {
        return TS_CANNOT_CREATE;
    }
    myTicketSet->usedTravels = 0;
    myTicketSet->originalTravels = n;
    myTicketSet->cost = c;
    myTicketSet->moneyLeft = n * c;
    char**  dates =  malloc(sizeof(char**)* (n)); //todo maybe c99 allows dynamic arrays?
    for (int i = 0; i < n; i++) {
        dates[i] =  malloc(sizeof(char)*GOOD_LENGTH+1);
        if (dates[i] == NULL) {
            free(dates);  
            free(t);
            return TS_CANNOT_CREATE;
        }
    }


    myTicketSet->dates = dates;
    *t = *myTicketSet;

    return TS_SUCCESS;
}


static void copyTicketSets(TicketSet* dest, const TicketSet* source) {

    dest->usedTravels = source->usedTravels;
    dest->originalTravels = source->originalTravels;
    dest->cost = source->cost;
    dest->moneyLeft = source->moneyLeft;

    for (int i = 0; i < source->originalTravels; i++) {
        if (NULL != source->dates[i]) {
            free(dest->dates[i]);
            dest->dates[i] = malloc(sizeof(char) * GOOD_LENGTH + 1);
            if (dest->dates[i] == NULL) {
                free(dest->dates); //todo free dates 0...i-1
                free(dest);
                return;
            }
            strcpy(dest->dates[i], source->dates[i]);
        }

    }

}
RabQavStatus rqLoadTS(RabQav* rq, TicketSet t, DateTime dt) {


    TicketSet toAdd;
    TicketSetStatus res = tsCreate(&toAdd, t.originalTravels, t.cost);
    if (res != TS_SUCCESS) {
        return RQ_FAIL;
    }

    copyTicketSets(&toAdd, &t);  
    rq->tickets[rq->usedContracts] = toAdd;
    rq->usedContracts++;
    return RQ_SUCCESS;

}
4

1 に答える 1

4

以下にいくつかの問題を示します。

TicketSetStatus tsCreate(TicketSet* t, int n, int c) {

どのように渡すことができますtsCreateTicketSet*?チケットセットを作成しますそのため、チケット セットへのポインタはエントリではわかりません。

*t = *myTicketSet;

これにより、 の値が の値に設定tされますmyTicketSet。しかし、値ではなく、新しいチケット セットへのポインターを返す必要がありました。

TicketSet toAdd;

この関数が戻ると、toAddスコープ外になり、破棄されます。それはあなたが望んでいたことではありません。

于 2012-08-10T18:02:56.403 に答える