0

私は、(ユーザーの入力によって決定される) 等しいサイズの配列を作成し、それらに乱数を入力して、C を練習しようとしています。いくつかの問題が発生しています。まず、配列の作成と割り当て:

    srandom((int)time(NULL)); /* initialize random seed for later use*/

    unsigned long arraySize = strtoul(argv[1], NULL, 0); 

    int *originalArray = malloc(arraySize * sizeof(int));
    int *ascendingOrderArray = malloc(arraySize * sizeof(int));
    int *descendingOrderArray = malloc(arraySize * sizeof(int));

次に、配列に乱数を入力するループ:

    int i = 0;
    int randInt;
    /* Seed each array with identical randomly generated numbers */
    while(i++ < arraySize){
        randInt = (int)random()%100;
        *originalArray++ = randInt;
        printf("original array assign: %d\n", originalArray);
        *ascendingOrderArray++ = originalArray;
        printf("ascending array assign: %d\n", ascendingOrderArray);
        *descendingOrderArray++ = originalArray;
        printf("descending array assign: %d\n", descendingOrderArray);

    }

ここで、事態は奇妙になります。各配列には、各インデックスの originalArray に割り当てられた番号と同じ番号が割り当てられると予想しています。しかし、printfステートメントから得た出力にはそれが反映されていません。さらに、数字は巨大ですが、2 から始まり、多くの桁に及ぶ同様の基数をすべて持っています。それは起こっているべきですか?

最後に、すべての作業が完了し、あまり意味のない印刷と書式設定を行うと、配列を解放しようとします。

free(originalArray);
originalArray = NULL;
free(ascendingOrderArray);
ascendingOrderArray = NULL;
free(descendingOrderArray);
descendingOrderArray = NULL;
return 0;

しかし、私はpointer being freed was not allocatedエラーが発生しています。

私はここで複数のレベルで失敗していると確信していますが、問題は次のとおりです。

4

1 に答える 1

1

3つのアレイすべてで同じ基本的な問題がありますが、1つだけを見てみましょう。ここでそれを割り当てます:

int *originalArray = malloc(arraySize * sizeof(int));

したがって、変数originalArrayは割り当てられたメモリのブロックを指します。次に、それを使用してアレイに割り当てます。

*originalArray++ = randInt;

これは悪いです。インクリメントoriginalArrayしたばかりで、メモリブロックの先頭へのポインタがありません。あなたがすべきことは

originalArray[i] = randInt; printf("original array assign: %d\n", originalArray[i]);

このように、インデックスiを使用して、配列内のどこに数値を配置するかを指定します。originalArrayそれ自体は、割り当てられたメモリのブロック、つまり配列の先頭へのポインタです。

originalArrayこのすべてを通して変わらないので、あなたが

free(originalArray);

それでもoriginalArray、から返された値でmallocあり、これが返されfreeたいものです。

要約:mallocが返す正確なポインターを常に解放する必要があり、そのポインターの値を破棄/変更しないでください。

于 2013-02-24T04:03:40.373 に答える