0

私は、コンピューター サイエンス 1 コースで追加単位を取得するために、スピード デート情報を並べ替えるプログラムを作成しようとしています。そして、私は奇妙な問題に直面しています。ネストされた一連のループに到達すると、ループを 2 回実行した後 (デバッグ関数が呼び出された時点で)、プログラムがクラッシュします。関数 transferData; ファイルからデータを取得し、それを構造体に移動して、まだ作成されていない関数によって後で処理するように設計されています。私は一生それを理解できないので、コードを下に置き、その下に私が使用しているテストデータを置いたので、どんなアドバイスも大歓迎です。

caData transferData(fData * fileData, caData * workingData, int numCouples)
{
    int i = 0, j = 0, k = 0;
    workingData->maData = (struct mData*)malloc(sizeof(mData)*(numCouples*2));//Create Array of Match Data with cells equal to double the number of couples
    workingData->maData->couData = (struct cData*)malloc(sizeof(cData)*numCouples);//Create a Couple structure array with a number of cells equal to the number of couples.
    ///TODO:
    //Read in Names
    for(i = 0; i < (numCouples * 2); i++)//Rotate through Matches
    {
        if(i < numCouples)//Men First
        {
            debug();
            for(j = 0; j < numCouples; j++)//Scan in First half of Couples
            {
                for(k = 0; k < numCouples; k++)//Scan In Male Names
                {
                    fscanf(fileData->inputData, "%s", workingData->maData[i].couData[j].guyName);
                }

                for(k = 0; k < numCouples; k++)//Scan In Female Names
                {
                    fscanf(fileData->inputData, "%s", workingData->maData[i].couData[j].girlName);
                }
            }
        }
        else//Now the women
        {
           for(j = 0; j < numCouples; j++)//Scan in First half of Couples
            {
                for(k = 0; k < numCouples; k++)//Scan In Female Names
                {
                    fscanf(fileData->inputData, "%s", workingData->maData[i].couData[j].girlName);
                }

                for(k = 0; k < numCouples; k++)//Scan In male Names
                {
                    fscanf(fileData->inputData, "%s", workingData->maData[i].couData[j].guyName);
                }
            }
        }
    }
    //Read In Scores
    //Compute differances

}

編集:コードをエラーの場所に凝縮しました。デバッグ関数が呼び出される場所です。2 回実行された後、クラッシュします。-1073741819 (0xC0000005) を返しています。

4

1 に答える 1

0

fscanf()FILE*引数を取りますfData*。それがエイリアスでない限り、意味のあることFILE*は何もしません。また、それが型エイリアス (typedef) である場合、なぜそのように難読化するのでしょうか?

関数に渡された何らかの構造の要素を割り当てています。渡したものと構造体の定義を表示しないと、表示されたコードの正確性を検証することはできませんが、文字列を割り当てるために使用する場合の最も一般的なエラーfscanf()は、バッファーをオーバーランするか、バッファーを割り当てていないことです。最初の場所。guynameこの場合、メンバーとgirlnameメンバーが十分な長さの配列であるかどうかを確認する必要があります。それらが単なるポインターである場合、データ用のスペースを割り当てる必要があります。書式指定子を変更して、長すぎる文字列をこれらのメンバーにコピーできないようにすることもできます。

呼び出し元が を渡す場合、workingData必要なデータを割り当てるのは呼び出し元の責任です。動的メモリをローカルに割り当てて、それを呼び出し元に戻すのは悪い習慣です。メモリがいつどこで解放されるかという問題が生じ、メモリ リークが発生します。

最後に、このコードをデバッグする最も簡単で最速かつ最良の方法は、シンボリック デバッガーでステップ実行することです。

于 2012-06-09T20:15:12.430 に答える