用户将输入三元组作为输入,第一个数字为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,第二个和第三个数字...
assert(Y >= 0);
assert(Y < n);
list[Y] += X;