malloc上的Seg故障

时间:2012-10-15 18:43:47

标签: c segmentation-fault malloc

我正在从一个文件中读取整数,当我尝试增加数组时,我在第二次调用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

2 个答案:

答案 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是有符号整数,它们可以达到负值,这对于计数是不正确的,并且还可能导致一些内存损坏。