#include <stdio.h>
#include <stdlib.h>
#define ALFA 4
int simVarDiscr(int* nr, int l, int nrm) {
int k = 0, i = 1;
double p, q;
q = (double)ALFA / (ALFA + l - 1);
p = (double)nr[1] / (ALFA + l - 1);
double F = p;
double u = genrand_real3(); // random number in (0,1) dont matter this
if (u > q)
return nrm + 1;
else {
while (u > F) {
k++;
p = (double)nr[i] / (ALFA + l - 1);
i++;
F += p;
}
return k;
}
}
int main() {
int* nr, i, nrm, a;
nr = (int*)malloc(1 * sizeof(int));
nr[0] = 1;
nrm = 1;
for (i = 1; i <= 10; i++) {
a = simVarDiscr(nr, i, nrm);
if (a > nrm) {
nrm++;
nr = (int*)realloc(nr, (nrm + 1) * sizeof(int));
nr[nrm] = 1;
} else {
nr[a]++;
}
printf("%d --- %d\n", a, nr[i]);
}
return 1;
}
嗨,我有这个错误:
*** glibc detected *** ./333: realloc(): invalid next size: 0x0804b008 *** ======= Backtrace: ========= /lib/libc.so.6(+0x6dffb)[0xb7759ffb] /lib/libc.so.6(+0x71640)[0xb775d640] /lib/libc.so.6(realloc+0xf3)[0xb775ec43] ./333[0x8048876] /lib/libc.so.6(__libc_start_main+0xfe)[0xb7702c0e] ======= Memory map: ========
我想从simVarDisc给出的nr增加一个数字。它与中餐厅流程类似。 如果SimVarDisc的返回值大于nrm,我想在nr中重新分配。 我被困在这里,其他类似问题的SO还没有工作......
如果我打印
printf(&#34;%d ---%d \ n&#34;,a,nr [i]);
它会显示:
2 --- 0 0 --- 1 3 --- 1 然后是上面的错误。
感谢大家。
答案 0 :(得分:0)
检查数组索引a
是否大于数组大小nrm
。但您需要做的是检查它是否相等或更大。
您可以在大小为1的数组中访问的唯一元素是索引0.如果您写入索引1,则您已在数组外部写入。