簡體   English   中英

Malloc上的段故障

[英]Seg fault on malloc

我正在從文件中讀取整數,並且當我嘗試擴展數組時,在第二次調用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;
}

我發現這特別奇怪,因為增大數組總是在第一次使用時有效,而在第二次時則無效。 我對一組大小為200000的測試數據使用了多個DEFAULT_SIZE值,范圍從2到20000。

是否有明顯的原因導致我在第二次調用growMyArray時遇到分段錯誤,特別是在int *grownArray = malloc(arrayToGrow.maxCount * sizeof(int));

您寫完了數組的末尾。

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]數組末尾的randomNumbers.numbers[randomNumbers.maxCount]

因此,改變>>=if語句出現。

照顧你的數據類型

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

這意味着count和maxcount是帶符號的整數,它們可以達到負數,這對於count是不正確的,並且還可能導致某些內存損壞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM