为什么总有例外?

Why there's always exception?

提问人:ojipadeson 提问时间:1/11/2022 最后编辑:ojipadeson 更新时间:1/11/2022 访问量:49

问:

我正在编写一个大数加函数,使用数组

#define MAXLEN 10

int * plus(int *a, int *b) {
    int *result;
    int tmp;
    int add = 0;
    result = (int *)malloc(MAXLEN); // A breakpoint exception was triggered
    for (int i = MAXLEN - 1; i >= 0; i--) {
        tmp = a[i] + b[i] + add;
        add = 0;
        if (tmp / 10) {
            add = tmp / 10;
            tmp = tmp % 10;
        }
        result[i] = tmp;
    }
    return result;
}

malloc 行上总是有异常,但在其他函数中,malloc() 运行良好。

这是怎么发生的?

以下是所有代码:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAXLEN 10

int * plus(int *a, int *b) {
    int *result;
    int tmp;
    int add = 0;
    result = (int *)malloc(MAXLEN);
    for (int i = MAXLEN - 1; i >= 0; i--) {
        tmp = a[i] + b[i] + add;
        add = 0;
        if (tmp / 10) {
            add = tmp / 10;
            tmp = tmp % 10;
        }
        result[i] = tmp;
    }
    return result;
}

void deliver(int *a, int *b) {
    for (int i = 0; i < MAXLEN; i++) {
        a[i] = b[i];
    }
}

void init_int(int *a) {
    for (int i = 0; i < MAXLEN; i++) {
        a[i] = 0;
    }
}

int * numWays(int n) {
    int *a, *b, *c, *sum;
    int j;
    a = (int *)malloc(MAXLEN);
    b = (int *)malloc(MAXLEN);
    c = (int *)malloc(MAXLEN);
    init_int(a);
    init_int(b);
    init_int(c);
    init_int(sum);
    a[MAXLEN - 1] = 1;
    b[MAXLEN - 1] = 1;
    c[MAXLEN - 1] = 2;
    for (int i = 0; i < n; i++) {
        sum = plus(plus(a, b), c);

        deliver(a, b);
        deliver(b, c);
        deliver(c, sum);
    }
    return a;
}

int main()
{
    int print_flag = 0;
    int *num;
    num = (int *)malloc(MAXLEN);
    num = numWays(4);
    for (int i = 0; i < MAXLEN; i++) {
        if (num[i]) {
            print_flag = 1;
        }
        if (print_flag) {
            printf("%d", num[i]);
        }
    }
    printf("\n");
    return 0;
}

这是一个关于如果青蛙每次可以跳 1、2 或 3 步,它能跳上 n 级台阶多少种方式的问题,我想要确切的数字。

c 函数 malloc

评论

4赞 kiner_shah 1/11/2022
尝试:。malloc(MAXLEN * sizeof(int))
2赞 Gerhardh 1/11/2022
我怀疑在保持线路时是否真的触发了异常。除非你完全搞砸了你的堆,否则怎么会失败?相反,我假设您的错误发生在您访问内存的行中:mallocresult[i] = tmp;
3赞 Gerhardh 1/11/2022
与您的问题无关,但在 C 中您不需要(也不应该)转换 的返回值。如果返回值是 ,则应检查返回值。mallocNULL
1赞 Cheatah 1/11/2022
一般来说,您应该经常在 malloc 参数中看到 a。如果附近没有,这不一定是错的,但你应该有点怀疑。sizeofsizeof

答:

3赞 gsamaras 1/11/2022 #1

改变:

result = (int *)malloc(MAXLEN);

对此:

result = malloc(MAXLEN * sizeof(int))

由于您要动态分配的内存大小等于 ,times .intMAXLEN

malloc 线上总是有例外

你的意思是编译错误。一个例外是一个更高级的概念,您可以稍后学习。

PS:我会投射malloc的结果吗?不。

评论

0赞 ojipadeson 1/11/2022
谢谢,但这是另一个异常“无法将”void *“类型的值分配给”int *“类型的实体
5赞 Jabberwocky 1/11/2022
@ojipadeson 这是因为您使用的是C++编译器。使用 C 编译器编译 C 代码,而不是使用 C++ 编译器。顺便说一句,我们不是在谈论异常,而是在谈论编译错误
0赞 Cheatah 1/11/2022
为了完整起见,另一种选择是使用 .result = malloc(sizeof *result * MAXLEN);