[英]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.