繁体   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