首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >malloc断层

malloc断层
EN

Stack Overflow用户
提问于 2012-10-15 18:43:46
回答 2查看 467关注 0票数 0

我从一个文件中读取整数,当我试图扩展我的数组时,我在第二个调用growMyArray(struct myArray) (特别是在int *grownArray = malloc(arrayToGrow.maxCount * sizeof(int)); )上有一个分段错误。

代码语言:javascript
复制
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;
}

我的结构:

代码语言:javascript
复制
typedef struct myArray {
    int count;
    int maxCount;
    int *numbers;
} myArray;

从输入重定向读取:

代码语言:javascript
复制
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)); )中出现分段错误,有什么明显的原因吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-15 18:49:05

你写过了数组的末尾。

代码语言:javascript
复制
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更改为>=

票数 5
EN

Stack Overflow用户

发布于 2012-10-15 18:52:45

注意你的数据类型

代码语言:javascript
复制
typedef struct myArray {
    int count;
    int maxCount;
    int *numbers;
} myArray;

这意味着count和maxcount是有符号整数,它们可以达到负值,这对于计数是不正确的,也可能导致一些内存损坏。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12901967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档