0

ファイルから整数を読み取っていて、配列を拡張しようとすると、 への2 回目の呼び出しでgrowMyArray(struct myArray)、特に でセグメンテーション エラーが発生しint *grownArray = malloc(arrayToGrow.maxCount * sizeof(int));ます。

struct myArray growMyArray(struct myArray arrayToGrow) {

    arrayToGrow.maxCount *= 2;

    int *grownArray = malloc(arrayToGrow.maxCount * sizeof(int));

    int i;
    for (i = 0; i < arrayToGrow.count; i++)
        grownArray[i] = arrayToGrow.numbers[i];

    free(arrayToGrow.numbers);

    arrayToGrow.numbers = grownArray;

    return arrayToGrow;
}

私の構造:

typedef struct myArray {
    int count;
    int maxCount;
    int *numbers;
} myArray;

入力リダイレクトからの読み取り:

struct myArray getRandomNumbers() {

    struct myArray randomNumbers;
    randomNumbers.count = 0;
    randomNumbers.maxCount = DEFAULT_SIZE;
    randomNumbers.numbers = malloc(randomNumbers.maxCount * sizeof(int));

    while (scanf("%d", &randomNumbers.numbers[randomNumbers.count]) == 1) {

        randomNumbers.count++;

        if (randomNumbers.count > randomNumbers.maxCount)
            randomNumbers = growMyArray(randomNumbers);
    }

    return randomNumbers;
}

配列の拡張は常に最初は機能しますが、2 回目は機能しないため、これは特に奇妙に感じます。DEFAULT_SIZEサイズ 200000 のテスト データのセットで 2 から 20000 までの範囲の複数の値を に使用しました。

への2 回目の呼び出しgrowMyArray、特に でのセグメンテーション エラーが発生する明らかな理由はありint *grownArray = malloc(arrayToGrow.maxCount * sizeof(int));ますか?

4

2 に答える 2

5

配列の末尾を超えて書き込みました。

while (scanf("%d", &randomNumbers.numbers[randomNumbers.count]) == 1) {

    randomNumbers.count++;

    if (randomNumbers.count > randomNumbers.maxCount)
        randomNumbers = growMyArray(randomNumbers);
}

>テストで使用するため、if一度だけ起動しますrandomNumbers.count = randomNumbers.maxCount + 1。つまり、配列の末尾を過ぎたscanf書き込みです。randomNumbers.numbers[randomNumbers.maxCount]

したがって、そこのステートメントに変更>します。>=if

于 2012-10-15T18:49:05.270 に答える
0

youreデータ型の世話をします

typedef struct myArray {
    int count;
    int maxCount;
    int *numbers;
} myArray;

これは、countとmaxcountが符号付き整数であり、countに対して正しくない負の値に達する可能性があり、メモリの破損につながる可能性があることを意味します。

于 2012-10-15T18:52:45.063 に答える