-2

我正在制作一个必须使用-ansi 和-pedantic 的C 程序。我想读取标准输入,但是当我调用 getchar() 时程序崩溃了。这是导致错误的行:

while((data = getchar()) != EOF) {

当我正常运行时它说

Calculator: malloc.c:2394: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted (core dumped)

和 GDB

Program received signal SIGABRT, Aborted.
0x00007ffff7a42428 in __GI_raise (sig=sig@entry=6)
at ../sysdeps/unix/sysv/linux/raise.c:54
54  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory

编辑:

这是我的分配代码

struct Expression* initParse(int argc, char const *argv[]) {
    struct Expression *expr = malloc(sizeof expr);
    enum WaitFor next = MinusNext | NumberNext | NewBraquetNext;
    testStdin(argc, argv);
    if(!expr)
        exit(1);
    expr->level = 0;
    expr->part = 0;
    expr->parts = malloc(sizeof expr->parts);
    if(!expr->parts)
        exit(1);
    expr->parts[0] = malloc(sizeof expr->parts[0]);
    if(!expr->parts[0])
        exit(1);
    expr->parts[0][0] = malloc(sizeof expr->parts[0][0]);
    if(!expr->parts[0][0])
        exit(1);
    expr->parts[0][0]->type = MainPartType;
    expr->parts[0][0]->priority = 0;
    return parse(expr, next, argv[1]);
}

和标题:

enum WaitFor
{
    MinusNext =         1 << 0,
    OperatorNext =      1 << 1,
    NumberNext =        1 << 2,
    NewBraquetNext =    1 << 3,
    EndBraquetNext =    1 << 4,
    FinalEndNext =      1 << 5
};

struct Part
{
    void *content;
    int priority;
    char *parent;
    enum PartType type;
};

struct Expression
{
    struct Part ***parts;
    int level;
    int part;
    struct Part lastNumber;
};
4

2 回答 2

0

最后我发现了问题所在。我有类似的东西,char *thing = malloc(sizeof thing)但它必须像char *thing = malloc(sizeof *thing)

于 2018-02-03T10:28:02.673 回答
0

您粘贴的代码绝对没有任何问题,除了它可以让我们确定到底是什么导致了问题。

但是,您看到的断言几乎可以肯定是由于堆损坏。x这是由分配字节然后将例如字节写入该区域引起的那种事情x + 42。这往往会破坏堆中的内存控制信息。

所以我建议首先查看代码中的任何内存分配,看看它们是否存在问题。

或者,这是一个想法,发布更多代码,以便我们实际上可以以更实质性的方式帮助您:-)

于 2018-02-02T10:38:47.207 回答