内存分配错误:线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x7fff5f3ffff8)

时间:2018-03-18 18:26:22

标签: c arrays pointers malloc

我正在研究一组40位数字并制作一个斐波那契序列,基本情况是这40个数字集合中的两个。如果我只使用int而没有动态内存的指针,它工作正常,但是当我实际使用Int40结构,它只是一个带有int *数字的结构时,我得到这个线程错误。我不知道这意味着什么,我已尝试用其他问题调查​​,但没有一个有用。谁能帮我?错误发生在第6行,使用ans->数字malloc

感谢您抽出宝贵时间!

Int40 *fibKw26(int n, Int40 *first, Int40 *second) {
    int count = 0;
    Int40 *arr = malloc(sizeof(Int40) * 3);
    if (count != n) {
        Int40 *ans = malloc(sizeof(Int40));
        ans->digits = malloc(sizeof(int) * 40);
        arr[0] = *first;
        arr[1] = *second;
        int x[40];
        int y[40];
        int m = 0;
        if (ans == NULL) {
            printf("Malloc error\n");
            exit(-1);
        }
        if (ans->digits == NULL) {
            printf("Malloc error\n");
            exit(-1);
        }
        for (m = 39; m >= 0; m--) {
            x[m] = first->digits[m];
        }
        for (m = 39; m >= 0; m--) {
            y[m] = second->digits[m];
        }
        int temp = 0;
        int carryout = 0;
        int carryin = 0;
        for (m = 39; m >= 0; m--) {
            //printf("%d + %d = ", x[m], y[m]);
            temp = x[m] + y[m];
            if (carryout == 1) {
                carryin = 1;
            }
            if (temp >= 16) {
                //printf(" equal or greater than 16 ");
                temp = temp % 16;
                carryout = 1;
                if (carryin == 1) {
                    //printf(" carried in ");
                    temp++;
                    carryin = 0;
                }
            }
            else {
                carryout = 0;
                if (carryin == 1) {
                    temp++;
                    //printf(" carried in ");
                    carryin = 0;
                    if (temp >= 16) {
                        temp = temp % 16;
                        carryout = 1;
                    }
                }
            }
            ans->digits[m] = temp;
            //printf("%d -- Carryout = %d\n", ans->digits[m], carryout);
        }
        arr[2] = *ans;
        free(ans);
        return fibKw26(n, &arr[1], &arr[2]);
    }
    else {
        return &arr[3];
    }
    return NULL;
}

1 个答案:

答案 0 :(得分:0)

我假设你的结构Int40是这样的:

typedef struct {
    int digits[40];
}Int40;

如果是这种情况,请执行以下操作:

Int40 *ans = malloc(sizeof(Int40));

您实际上是为所有40个整数分配内存。所以这样做:

ans->digits = malloc(sizeof(int) * 40);

完全错误和不必要。还有一件事,假设代码会以某种方式工作:

    Int40 *ans = malloc(sizeof(Int40));
    ans->digits = malloc(sizeof(int) * 40);
    arr[0] = *first;
    arr[1] = *second;
    int x[40];
    int y[40];
    int m = 0;
    if (ans == NULL) {
        printf("Malloc error\n");
        exit(-1);
    }

你正在使用第2行的ans指针,但是你正在测试它的代码为NULL ...这是错误的!

编辑:我看到的其他内容:

arr[2] = *ans;
free(ans);
return fibKw26(n, &arr[1], &arr[2]);

您正在释放ans的内存,但是您尝试将指向该内存的指针传递给fibKw26函数。你使用arr的方式也是错误的。伙计,你的代码是一团糟。如果您不了解指针和内存分配/释放的工作原理,请更好地使用数组或坐下来学习。