与患者年龄相关的疾病病例数>>

问题描述 投票:0回答:1

用户将输入三元组作为输入,第一个数字为0,第二个数字为确定年龄的疾病病例数(第三个数字),或者第一个数字为1,第二个和第三个数字为年龄区间的极限值。我必须将“案件数”与“年龄”链接起来,并且能够编辑这些案件数,它有可能收到更多已经引用过的年龄的案件(第一个数字:0)。除此之外,它还会给出数字X和Y,这样我就必须打印与X和Y之间的年龄相关的病例数(第一个数字:1)。我使用的语言是C。

我尝试过此代码

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

int l[3], *list, n = 5;

void add(int X, int Y){
    while (Y < n){
        n = n * 2;
        list = realloc(list, n * sizeof(int));
    }
    list[Y] += X;
}

void consult(int X, int Y){
    int print = 0;
    for (int k = X; k <= Y; ++k){
        print += list[k];
    }
    printf("%d\n", print);
}

int main() {
    int P;
    scanf("%d", &P);
    list = (int*)calloc(n, sizeof(int));
    for (int i = 0; i < P; ++i){
        for (int j = 0; j < 3; ++j){
            scanf("%d", &l[j]);
        }
        if (l[0] == 0){
            add(l[1],l[2]);
        } else {
            consult(l[1],l[2]);
        }
    }
    return 0;
}

对于输入:

20
0 194 9
1 7 41
0 102 38
1 30 43
0 22 49
1 34 56
1 15 20
1 34 57
1 34 51
0 128 39
0 97 57
0 114 25
0 10 82
0 127 35
1 66 164
0 60 85
0 155 48
1 60 186
1 10 384
0 166 950

它运行,返回:

194
102
124
0
124
124
10
70
815

[Program exited with exit code 0]

但是]

40
0 151 25
0 5 3
0 99 1
0 109 14
0 115 15
0 110 1
0 191 2
0 94 9
1 11 13
1 25 31
1 1 33
1 14 26
0 49 31
1 28 33
1 18 34
1 16 23
1 28 38
1 13 26
1 2 5
1 17 29
0 132 8
1 21 24
0 137 0
1 0 13
1 8 26
1 12 20
0 22 63
1 5 8
1 24 70
1 51 61
1 36 40
0 164 42
1 55 70
0 134 112
0 71 105
0 101 7
0 17 67
1 56 252
0 172 363
0 18 188

它返回“超出最大堆栈或内存大小,或无效的指针(代码139)”。

如何在我的代码中解决此问题?

观察:有义务以5的大小开始向量,如果大小不够,我需要复制以前的存储容量。

用户将输入三元组作为输入,第一个数字为0,第二个数字为确定年龄的疾病病例数(第三个数字),或者第一个数字为1,第二个和第三个数字...

c function pointers allocation
1个回答
0
投票
如果在访问数组元素之前添加断言,则会发现数组索引超出范围:

assert(Y >= 0); assert(Y < n); list[Y] += X;

© www.soinside.com 2019 - 2024. All rights reserved.