我正在从一个文件中读取整数,当我尝试增加数组时,我在第二次调用growMyArray(struct myArray)
时遇到了分段错误,特别是在{{1} }:
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;
我发现这个特别奇怪,因为增长阵列总是第一次起作用,但第二次不起作用。我在{200}的一组测试数据中使用了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到20000。
是否有明显原因导致我在DEFAULT_SIZE
的第二次来电时出现细分错误,特别是在growMyArray
?
答案 0 :(得分: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
更改为{{1}}。
答案 1 :(得分:0)
照顾你的数据类型
typedef struct myArray {
int count;
int maxCount;
int *numbers;
} myArray;
这意味着count和maxcount是有符号整数,它们可以达到负值,这对于计数是不正确的,并且还可能导致一些内存损坏。