【问题标题】:*** glibc detected *** ./333: realloc(): invalid next size: 0x0804b008 ****** 检测到 glibc *** ./333:realloc():下一个大小无效:0x0804b008 ***
【发布时间】:2014-08-13 15:21:15
【问题描述】:
#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("%d --- %d\n", a, nr[i]);

它会显示:

2 --- 0 0 --- 1 3 --- 1 然后上面的错误。

感谢大家。

【问题讨论】:

  • 是我的错,应该是0,和0一样
  • 您的内存分配有问题 - 但您知道这一点。由于您可能在 Linux 或某些 BSD 上,我建议安装 Valgrind 工具,因为 Valgrind 内存分析器可以直接告诉您内存问题(包括它们发生位置的完整堆栈跟踪。)
  • nr[a]++; : 有可能破坏除安全区域以外的区域。
  • 我不明白安全是什么意思...
  • 当您在分配的缓冲区之外写入时会发生这种类型的错误,但我在您的代码中的任何地方都看不到这种情况。 (缓冲区外有一些读取,但这无关紧要)。 您确定您发布的代码与给出错误的代码完全相同相同吗?是否以任何方式进行了简化?

标签: c malloc realloc


【解决方案1】:

您检查数组索引a 是否大于数组大小nrm。但是您需要做的是检查它是否等于或更大。

您可以在大小为 1 的数组中访问的唯一元素是索引 0。如果您写入索引 1,则您已经写入了数组之外。

【讨论】:

  • 代码正在分配nrm+1 元素,所以比较应该没有问题。
  • @NisseEngström:你不应该依赖它。您的 nrm 应该是数组的大小。否则你(或其他编写代码的人)会犯错误。正如您在初始设置期间 malloc 1 元素 并将 nrm 设置为 1 所证明的那样。
猜你喜欢
  • 2014-06-28
  • 2015-05-23
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多