我从一个文件中读取整数,当我试图扩展我的数组时,我在第二个调用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;
}我觉得这特别奇怪,因为增长数组总是第一次起作用,但第二次却不起作用。我对DEFAULT_SIZE使用了多个值,在一组大小为200000的测试数据上,其范围从2到20000不等。
我为什么在第二次调用growMyArray (特别是在int *grownArray = malloc(arrayToGrow.maxCount * sizeof(int)); )中出现分段错误,有什么明显的原因吗?
发布于 2012-10-15 18:49:05
你写过了数组的末尾。
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-15 18:52:45
注意你的数据类型
typedef struct myArray {
int count;
int maxCount;
int *numbers;
} myArray;这意味着count和maxcount是有符号整数,它们可以达到负值,这对于计数是不正确的,也可能导致一些内存损坏。
https://stackoverflow.com/questions/12901967
复制相似问题